{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 逻辑斯特回归示例\n",
    "\n",
    "- [逻辑斯特回归](#逻辑斯特回归)\n",
    "- [正则化后的逻辑斯特回归](#加正则化项的逻辑斯特回归)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %load ../../standard_import.txt\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from scipy.optimize import minimize\n",
    "\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "pd.set_option('display.notebook_repr_html', False)\n",
    "pd.set_option('display.max_columns', None)\n",
    "pd.set_option('display.max_rows', 150)\n",
    "pd.set_option('display.max_seq_items', None)\n",
    " \n",
    "#%config InlineBackend.figure_formats = {'pdf',}\n",
    "%matplotlib inline\n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_context('notebook')\n",
    "sns.set_style('white')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loaddata(file, delimeter):\n",
    "    data = np.loadtxt(file, delimiter=delimeter)\n",
    "    print('Dimensions: ',data.shape)\n",
    "    print(data[1:6,:])\n",
    "    return(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n",
    "    # 获得正负样本的下标(即哪些是正样本，哪些是负样本)\n",
    "    neg = data[:,2] == 0\n",
    "    pos = data[:,2] == 1\n",
    "    \n",
    "    if axes == None:\n",
    "        axes = plt.gca()\n",
    "    axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', s=60, linewidth=2, label=label_pos)\n",
    "    axes.scatter(data[neg][:,0], data[neg][:,1], c='y', s=60, label=label_neg)\n",
    "    axes.set_xlabel(label_x)\n",
    "    axes.set_ylabel(label_y)\n",
    "    axes.legend(frameon= True, fancybox = True);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑斯特回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dimensions:  (100, 3)\n",
      "[[30.28671077 43.89499752  0.        ]\n",
      " [35.84740877 72.90219803  0.        ]\n",
      " [60.18259939 86.3085521   1.        ]\n",
      " [79.03273605 75.34437644  1.        ]\n",
      " [45.08327748 56.31637178  0.        ]]\n"
     ]
    }
   ],
   "source": [
    "data = loaddata('data1.txt', ',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.c_[ np.ones((data.shape[0],1)), data[:,0:2] ]\n",
    "y = np.c_[data[:,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Pass', 'Fail')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑斯特回归假设\n",
    "#### $$ h_{\\theta}(x) = g(\\theta^{T}x)$$\n",
    "#### $$ g(z)=\\frac{1}{1+e^{−z}} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义sigmoid函数\n",
    "def sigmoid(z):\n",
    "    return( 1 / (1 + np.exp(-z)) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "其实scipy包里有一个函数可以完成一样的功能:<BR>\n",
    "http://docs.scipy.org/doc/scipy/reference/generated/scipy.special.expit.html#scipy.special.expit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 损失函数\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big]$$\n",
    "#### 向量化的损失函数(矩阵形式)\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义损失函数\n",
    "def costFunction(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta))\n",
    "    \n",
    "    J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y))\n",
    "               \n",
    "    if np.isnan(J[0]):\n",
    "        return(np.inf)\n",
    "    return J[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 求偏导(梯度)\n",
    "\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} $$ \n",
    "#### 向量化的偏导(梯度)\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y)$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#求解梯度\n",
    "def gradient(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta.reshape(-1,1)))\n",
    "    \n",
    "    grad =(1.0/m)*X.T.dot(h-y)\n",
    "\n",
    "    return(grad.flatten())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cost: \n",
      " 0.6931471805599452\n",
      "Grad: \n",
      " [ -0.1        -12.00921659 -11.26284221]\n"
     ]
    }
   ],
   "source": [
    "initial_theta = np.zeros(X.shape[1])\n",
    "cost = costFunction(initial_theta, X, y)\n",
    "grad = gradient(initial_theta, X, y)\n",
    "print('Cost: \\n', cost)\n",
    "print('Grad: \\n', grad)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 最小化损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Software\\Anaconda\\Installation\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: divide by zero encountered in log\n",
      "  \n",
      "D:\\Software\\Anaconda\\Installation\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: divide by zero encountered in log\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "      fun: 0.2034977015895099\n",
       " hess_inv: array([[ 2.85339493e+03, -2.32908823e+01, -2.27416470e+01],\n",
       "       [-2.32908823e+01,  2.04489131e-01,  1.72969525e-01],\n",
       "       [-2.27416470e+01,  1.72969525e-01,  1.96170322e-01]])\n",
       "      jac: array([-2.68557618e-09,  4.36433487e-07, -1.39671757e-06])\n",
       "  message: 'Optimization terminated successfully.'\n",
       "     nfev: 34\n",
       "      nit: 25\n",
       "     njev: 30\n",
       "   status: 0\n",
       "  success: True\n",
       "        x: array([-25.16131634,   0.2062316 ,   0.20147143])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res = minimize(costFunction, initial_theta, args=(X,y), jac=gradient, options={'maxiter':400})\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 做一下预测吧"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(theta, X, threshold=0.5):\n",
    "    p = sigmoid(X.dot(theta.T)) >= threshold\n",
    "    return(p.astype('int'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 咱们来看看考试1得分45，考试2得分85的同学通过概率有多高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7762903249331021"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sigmoid(np.array([1, 45, 85]).dot(res.x.T))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 画决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(45, 85, s=60, c='r', marker='v', label='(45, 85)')\n",
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Admitted', 'Not admitted')\n",
    "x1_min, x1_max = X[:,1].min(), X[:,1].max(),\n",
    "x2_min, x2_max = X[:,2].min(), X[:,2].max(),\n",
    "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "h = sigmoid(np.c_[np.ones((xx1.ravel().shape[0],1)), xx1.ravel(), xx2.ravel()].dot(res.x))\n",
    "h = h.reshape(xx1.shape)\n",
    "plt.contour(xx1, xx2, h, [0.5], linewidths=1, colors='b');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加正则化项的逻辑斯特回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dimensions:  (118, 3)\n",
      "[[-0.092742  0.68494   1.      ]\n",
      " [-0.21371   0.69225   1.      ]\n",
      " [-0.375     0.50219   1.      ]\n",
      " [-0.51325   0.46564   1.      ]\n",
      " [-0.52477   0.2098    1.      ]]\n"
     ]
    }
   ],
   "source": [
    "data2 = loaddata('data2.txt', ',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拿到X和y\n",
    "y = np.c_[data2[:,2]]\n",
    "X = data2[:,0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画个图\n",
    "plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 咱们整一点多项式特征出来(最高6阶)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(118, 28)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly = PolynomialFeatures(6)\n",
    "XX = poly.fit_transform(data2[:,0:2])\n",
    "# 看看形状(特征映射后x有多少维了)\n",
    "XX.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 正则化后损失函数\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big] + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$\n",
    "#### 向量化的损失函数(矩阵形式)\n",
    "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big) + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义损失函数\n",
    "def costFunctionReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta))\n",
    "    \n",
    "    J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y)) + (reg/(2.0*m))*np.sum(np.square(theta[1:]))\n",
    "    \n",
    "    if np.isnan(J[0]):\n",
    "        return(np.inf)\n",
    "    return(J[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 偏导(梯度)\n",
    "\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} + \\frac{\\lambda}{m}\\theta_{j}$$ \n",
    "#### 向量化的偏导(梯度)\n",
    "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y) + \\frac{\\lambda}{m}\\theta_{j}$$\n",
    "##### $$\\text{注意，我们另外自己加的参数 } \\theta_{0} \\text{ 不需要被正则化}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradientReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta.reshape(-1,1)))\n",
    "      \n",
    "    grad = (1.0/m)*XX.T.dot(h-y) + (reg/m)*np.r_[[[0]],theta[1:].reshape(-1,1)]\n",
    "        \n",
    "    return(grad.flatten())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "initial_theta = np.zeros(XX.shape[1])\n",
    "costFunctionReg(initial_theta, 1, XX, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/YAAAFNCAYAAACqivTLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeVxU1f/H8dcMm4IbIOACam644K5pueKGa5qWuZuammUmll+1NM3UFkurb2pqppbmWqZZ7maamrmk4oZLLrgxBKYIAgNzfn/wY74iO8zO5/l48FDuvXPumcvw5p5zzz1Xo5RSCCGEEEIIIYQQwi5prV0BIYQQQgghhBBC5J807IUQQgghhBBCCDsmDXshhBBCCCGEEMKOScNeCCGEEEIIIYSwY9KwF0IIIYQQQggh7Jg07IUQQgghhBBCCDsmDXszmTlzJj169KBHjx4EBQUREhJi/D4hISHX5YwYMYJLly6Zsaa27fz58/Tt25du3brRt29fDh06lG69UoqJEyeydOnSLMv44IMPaNOmjfH4jxs3DoDY2FjGjh1Lt27d6NKlC4sXLza+Zs2aNbRv355evXoRERFhXD5ixAguX76c7/cTFhbG2LFjATh16hTvvPMOAIcPH6Zbt245vv7GjRs0aNAg3/vPSWBgIDExMTlut3TpUiZNmmS2emzYsIEuXbrQsWNHpk2bhl6vL9B2wn5IdppGZGQkw4cP55lnnqF79+5s2rTJuG7lypV07dqVbt26MXr0aKKjozMtY+/evXTv3p2QkBDGjh3LgwcPjOuaNm1q/Ln06NGDzZs3A5KdOTF3dgIkJSUxdOhQtm3bluU2kp32SfLRNBISEpgxYwY9e/YkJCSEr776Kt363JxbZpWPCQkJTJ48mW7dutG1a1cmT55s/NlIPmbPWvn48OFD3njjDTp37kxISAi7du0yrjt58iS9e/emc+fODBkyBJ1Ol2m5ud3O7JQwu+DgYHXq1ClrV8MuBQcHqw0bNiillNLpdKpjx45Kp9MppZS6dOmSGjRokKpXr5766quvsiyjT58+6tixYxmWv/fee2rmzJlKKaXi4uJUcHCwOn78uHG/CQkJasuWLeqDDz5QSin1yy+/GP9vCt9//70aOXKkUkqpP/74Q3Xt2jXH10RERKj69eubrA6Pq169uoqOjs5xu6+++kpNnDjRLHUIDw9XrVq1UtHR0SolJUWFhoaqxYsX53s7Yb8kO/Nv4sSJ6tNPP1VKKXXnzh1Vv359pdPpVFhYmAoODlb3799XSin1wQcfqKlTp2Z4fXR0tGrWrJm6cuWKUkqpjz76SE2bNk0ppdTly5dVx44dM92vZGf2zJmdSil1/Phx1bNnT1W3bl21devWTLeR7HQMko/5995776nx48er5ORkdf/+fRUcHKz++usvpVTuzi2zy8e5c+eqCRMmqJSUFJWcnKxCQ0ONWSz5mD1r5eOHH36opkyZopRS6ubNm6pFixbq9u3bKjExUbVq1UodPXpUKaXUqlWr1EsvvZSh3NxuZwnO1ulOKNz++9//cuLECXQ6HYGBgUyaNIl33nmH6OhooqKiKF++PJ9++ine3t60bduWzz77jPj4eObNm0dAQAAXL14kOTmZd999l0aNGqUr22AwMHv2bE6ePElcXBxKKWbOnEmjRo2Ii4tj5syZHD9+HCcnJ9q3b09oaCjx8fGZLp88eTLVqlVj+PDhAEyaNMn4fdu2balbty7h4eGMHz8eZ2dnFi1aRFJSEjExMfTs2dN4ZXzDhg0sW7YMrVaLp6cnH374IfPnz8fb25vQ0FAANm3axI4dO5g/f77xvcTExHD79m169uwJgI+PD4GBgezfv59evXqxatUqnn/+ecqVK5flsU5KSuLs2bN89dVXREREUKlSJSZPnky5cuV4++23SUlJASAqKoqkpCSKFy8OgIuLCw8fPiQ2Ntb4/6+//pply5Zlua/ly5dz5swZ5syZg16vp2nTprz99tv07t2bo0eP8uGHH/Lmm2/y3nvvsWTJEj7//HNiY2OZPHkyPXv2JD4+ntDQUP7++28SExOZOXMmjRs3zvXn6sqVK8yYMYO4uDiioqKoUaMGn376KW5ubtSpU4ehQ4dy8OBB4uPjGTNmDNu2bePChQv4+vry5Zdf4u7uDsCnn35KWFgYBoOBcePGERwcjF6vZ+bMmRw8eBBvb2+8vb2Nx+rEiRPMmTOHpKQkoqKiePrpp5k9e3aG+o0dO5Zr166lW+bv75/uZw6we/du2rZti5eXFwAvvPACM2fOZMSIEfnaTjgOyc7cZSdASkoKsbGxKKV4+PAhzs7OaLVagoKC2L59Oy4uLiQmJhIZGYm/v3+GY/37779Tp04dKlWqBEC/fv3o0aMH06ZN46+//kKr1dK/f39iY2MJCQlh9OjRODk5SXZaMTsBvv32W9544w0WLVqU5fuV7HRMko+5y0elFJs2bWLDhg04OTlRvHhxVqxYQcmSJQFydW6ZXT42adKE8uXLo9WmDoquWbOmcXSE5KNt5uOuXbv4+OOPAShXrhzNmzdn69at1K1bl2LFihl/H5577jlmz57N3bt38fT0NL4+LCwsV9tZhFW6EwqZx3tVP//8cxUSEqL0er1SSqnly5erRYsWKaWUMhgM6qWXXlJLly5N99o//vhD1axZU509e1YppdTSpUvVgAEDMuzr+PHj6rXXXlMpKSlKKaUWLVqkRo0apZRSavbs2So0NFQlJyerxMRENWDAAPXHH39kuXzixInpeisf/T44OFh98cUXxjoPHDjQ2HN5584dVbNmTRUdHa3OnTunmjZtqm7duqWUUmrZsmVq6tSp6uzZs6p58+bGY9C/f3+1b9++DO+nffv2av369Uoppa5fv66efvpp9eWXX6bb5vF6Pur69evqpZdeUuHh4cpgMKglS5aoHj16KIPBYNzmjTfeUEFBQcZjoJRS27ZtU926dVPDhg1TUVFRau7cuWrjxo2Z7iPNzZs3VbNmzVRKSoo6dOiQat68uRo/frxSKrU3cPHixel6Tx/vVa1Zs6Y6ceKE8TgNHjw4wz6y61X94IMP1I8//qiUUiopKUl169ZNbdu2TSmV2lu6YsUKpVTqZ6JBgwbqzp07KiUlRT377LNq8+bNxu3SPovh4eHqySefVNHR0Wr58uVq8ODBKjExUcXFxalnn33W2KsaGhqq/vjjD6WUUg8ePFBNmzZVYWFh2R6r7EydOtVYB6WUunr1qmrSpEm+txP2S7Iz/9l5+/ZtFRwcrJo3b65q1apl/P1Ps3PnTvXkk0+qFi1aGPf/qEWLFqW7kq/X61X16tVVbGysWrt2rZoxY4aKi4tT9+7dUy+88IJatmyZUkqyUynrZeejBg4cmOUVe8lOxyD5mL98/Oeff1TNmjXVd999pwYOHKieeeYZtXz58gzvObtzy+zy8VE3btxQzZs3V3v27FFKST4qZZv5GBQUZBwNrFTqqIvZs2erLVu2qGHDhqV7bcuWLdW5c+fSLcvtdpYgV+ytpH79+jg7px7+IUOGcPToUZYtW8bVq1e5ePEi9erVy/CacuXKUbNmTQBq1arFxo0bM2zToEEDSpYsyZo1a4iIiODw4cN4eHgAcPDgQSZPnoyTkxNOTk6sXLkSSL1nK7PlmZX/qLQeP41Gw5dffsnevXvZsmULly9fNl4lOnToEC1atKBs2bIAvPjii8bX+/v7s3fvXp544gl0Oh0tWrTIsI+FCxfy4YcfsmLFCgIDA2ndujUuLi7Z1utRAQEBLFmyxPj98OHDWbBgATdu3CAgIACAjz/+mHfffZexY8cyf/58xo4dS0hICCEhIQBcv36dEydO8PrrrzNr1iyuXr3K008/zdChQ9Ptq1y5cpQtW5bTp0+zf/9+Ro4cyeLFi1FKsWfPHhYvXszt27ezrWvaz71GjRp8//33uX6fABMmTODAgQMsWbKEq1evotPpiI+PN65Pez8VKlSgevXq+Pn5Aak/h3v37hm369evHwDVq1enSpUq/PXXXxw6dIhu3brh6uqKq6sr3bt3Jzw8HEidw2Dfvn18+eWXxh7hR/ebJre9qkqpDN+n9XznZzvhWCQ7c5edb775Ji+99BL9+/fn6tWrDBo0iPr161O3bl0A2rdvT/v27Vm3bh3Dhw9n586d6X5/DAYDGo0mQ7larZY+ffqkWzZ06FC+/fZbXnzxRclOrJeduSXZ6bgkH3POx+TkZFJSUrh+/TorVqwgJiaGQYMGUb58edq3b5/jMYbs8zHN6dOnGTNmDAMHDiQ4OBhA8hHbzEelVIafp1arzfTnrJTCyckp3bLcbmcJ0rC3krShKQBz5szh1KlT9O7dm6ZNm5KcnJzhDy9AkSJFjP/XaDSZbrN3715mzZrF0KFDadeuHZUrVzZOauTs7Jzug3f79m2KFCmS5fLH9/H45Dpp7yE+Pp5nn32W9u3b07hxY3r37s2uXbuMH+pHy05ISODmzZtUqVKFAQMG8P3331OpUiX69OmTaUgaDAYWLlxo/EM1bNgw2rZtm8VRzej8+fOcP3/eOJwfUn/ZXFxc2L9/vzGEPDw86Nq1Kzt27MhQxvvvv8/EiRM5ePAgcXFxLF682FiPihUrptu2ffv27Nu3jwMHDrBo0SK2bNnCL7/8QpEiRahQoUK24ftoh0VWP9/sjB8/npSUFDp37kybNm24fft2ujIeLT+7zpHHT+7Tjv2jHg2rgQMHEhgYSMuWLencuTMnT57MtO6ff/55rt5H2bJl0006otPpKFOmTL63E45FsjPn7IyJieHYsWMsX74cgEqVKtG8eXOOHDlCyZIliYqKMp489+7dm2nTpnHv3r10QwbLli3LyZMnjd9HRkZSsmRJ3N3d+fHHH6lRowY1atQAUjM1s5yQ7LRsduaWZKfjknzMOR89PT1xcXGhZ8+eaLVaSpcuTZs2bfjrr79y3bDPLh8Bfv75Z959912mTp1K9+7dMy1D8tF28jEtE0uXLg2kZmKNGjUyZKVer+fff/81dl48/vqctrME6aK1Ab///jtDhgyhZ8+eeHt7c/DgQeO933l14MABgoOD6d+/P0FBQezatctY1lNPPcXGjRsxGAwkJSUxduxYjhw5kuVyT09PTp8+DaSG1p9//pnpPq9du8aDBw8YN24cbdu25fDhwyQlJWEwGGjatCmHDh0yfuDXrFnDnDlzgNRevnPnzrF9+3Z69+6dadnvvPOOcXbK48ePc/HiRZ5++ulcHw+tVsusWbOMs49+9913BAYGUqZMGbZu3cr8+fNRSpGUlMTWrVtp1qxZutf/+uuv+Pn5UatWLZKSkox/qDQaTaYz0Hbs2JGffvoJg8GAn58fzZs3Z86cOXTs2DHDtk5OTiQnJ+f6veTk999/59VXX6VLly5A6gyd+fkcpfWmnzlzhuvXr1OvXj1atmzJjz/+SGJiIomJifzyyy8A3L9/n7CwMN588006duzInTt3uH79OgaDId/vo23btuzZs4fo6GiUUqxduzbTP7a53U44LsnOzLPT09OTMmXKsH37diC1oX/kyBHq1atHVFQU48ePN85Q/NNPP1GtWrUM9wG2aNGCkydPcvXqVeP+27VrB8DFixf5/PPPSUlJISEhgVWrVhlzJ41kp+WzM7ckOwsHycfM89HV1ZXg4GB+/PFHAOLi4jh48CB16tTJ9fHILh/37NnDzJkzWbp0aZaNeslH28rHdu3asXbtWgDu3LnD/v37CQ4Opl69evz7778cP34cgO+//5769etTokSJdK/P7XaWIFfsbcCrr77KRx99xGeffYaLiwsNGzbk+vXr+Sqrb9++vPHGG3Tv3p3k5GSaN2/Ojh07MBgMjBkzhlmzZtGjRw9SUlKMj7pp0aJFpsvr1KnDm2++SUhICP7+/hkavWkCAwNp06YNnTt3xtXVlerVq1O1alWuXbtGy5YtmTBhAi+99BKQOgFe2uQXrq6uhISE8M8//xgn8XncjBkzmDJlCvPnz8fd3Z2FCxem65HOTFhYGFOmTGHTpk1Ur16dKVOmMHr0aFJSUihTpgxz584FUidsmTZtmjF427dvz+DBg43lJCUlsWDBAuNQ/hYtWrBq1So6dOjAU089RWBgYIZ9V61aFY1Gw1NPPWV8zYIFC4xDlR5Vv3595s+fz5gxYxg0aFC27+lR8fHxGR5LsmbNGkJDQ3n11Vdxd3enWLFiNGnSJF+fo4iICHr27IlGo2Hu3LmUKlWKvn37cv36dbp160apUqWMvcklSpRg5MiRPPvss7i7u+Pn50fDhg25du2a8RjkVY0aNXj11VcZMmQIer2eevXqGSd12r17N2vWrGHJkiXZbicKB8nOzLNTo9GwcOFC3nvvPRYsWIBWq2XUqFHGq/Qvv/wygwcPxsnJCV9fX+OQxUez09vbm/fff5+xY8ei1+upUKECH374IQBjxoxhxowZxmPVqVMnnn/+eeP+JTutk53ZkewsfCQfsz63fO+995g1axZdunQhJSWF7t2706lTp2yPQW7z8cMPP0QpxZQpU4yvbdiwIdOmTQMkH20xH1977TWmT59O165dSUlJYcKECVSoUAGAL774ghkzZvDw4UNKlSpl/DlHRkYab4vw8/PLcjtL06i8jskQwkTi4+MZOHAg77zzDvXr17d2dYQQwi5IdgohROYkH0VhJkPxhVXs37+fNm3a0LJlSwleIYTIJclOIYTInOSjKOzkir0QQgghhBBCCGHH5Iq9EEIIIYQQQghhxwrN5HkJCQmcPn0aHx8fqzxXUAjhmFJSUoiKiiIoKCjdY4McgeSmEMIcHDk3QbJTCGEeOWVnoWnYnz59mgEDBli7GkIIB7Vq1SrjrOOOQnJTCGFOjpibINkphDCvrLKz0DTsfXx8gNQDUaZMGSvXRmQnLOwZ4uLCslzv4VGHOnU2W7BGpqGU4sKFUdy7dwCDId64XKt1p1SpFlSr9iUajcaKNRT5cefOHQYMGGDMGEciuWk/JDeFPXHk3ATJTnsi2SnsSU7ZWWga9mlDocqUKYO/v7+VayOy4+LyBuHhozAY4jKs02o9CAx8Ez8/+/sZRkauwsVlH15ej7+v+2i1v+Hquh8/v/5WqZsoOEccbim5aT8kN4U9csTcBMlOeyLZKexRVtkpk+cJm+Pr2w9Pz/ZotR7plmu1Hnh5dcDXt6+ValYwERHzMv3DAWAwxBERMdfCNRJCOArJTSGEyDvJTuFICs0Ve2E/NBotQUE/oNOtISJiLomJN3Bz8ycgYDy+vn3RaOyzPyoxMSKH9TcsVBMhhKOR3BRCiLyT7BSORBr2wiZpNFr8/Po71DAhN7cA9HpdNuvtb6iXEMJ2SG4KIUTeSXYKR2Gf3VBC2KGAgNAMQ73SaLUeBASMt3CNhBDCtkluCiFE3kl2Fk7SsBfCQhz1Pi4hhDAXyU0hhMg7yc7CSYbiC2EhjnoflxBCmIvkphBC5J1kZ+EkDXshLMgR7+MSQghzktwUQoi8k+wsfKS7RgghhBBCCCGEsGPSsBdCCCGEEEIIIeyYDMW3E0oZ0OlWExExj8TECNzcAggICMXXt1+hv09Gjo0QIiuSD5mT4yKEyI5kRObkuAhbZrWG/YMHD+jbty9ffvkl/v7pn6V47tw53n77beLi4mjcuDHvvvsuzs7O3Lp1iwkTJhAdHc0TTzzBxx9/jIdH5o9ycCRKGTh9uhd37+7CYIgDQK/XER4+iqioDdSu/b3dh0l+g7IwHBshRP4UhnzIT3YWhuMihMi/wpARkp3CEVnl03fy5En69evH1atXM10/YcIE3nnnHbZv345SinXr1gHw7rvv0r9/f7Zt20ZQUBALFiywYK2tR6dbnS5E0hgMccTE7ESnW2PW/RuUgSM3j7Dy1Eqm753OwB8G0vSrpnh/5E2x2cWo8nkVnl76NM+ufZaXt7zM9L3T2Xt1LymGlFyVnxaU4eGjePDgGHq9jgcPjhEePoozZ3qjlCHL11r72AghbJej50N+s9PRj4sQomAcPSMkO4WjskrDft26dUybNg1fX98M627evElCQgL169cHoFevXmzbtg29Xs+RI0cICQlJt7wwiIiYlyFE0hgMcUREzDXbvk/cOUHLZS0Z8MMAtlzYQoohhQ6VOzC341zOvXqOW2/cYvvA7czpMIdBdQdRz68e+hQ947ePp/zc8ozeMpo9V/aQbEjOch8FCUprHhshhG1z9HzIb3Y6+nERQhSMo2eEZKdwVFYZij9r1qws1+l0Onx8fIzf+/j4EBkZyd27dylWrBjOzs7plhcGiYkROay/Yfp9Jify5o43WXd2HTODZzKswTCctE6ZblvCrQRVvaqmWzar3SwuxVxiw9kNTNg5gRv3b9C3dl/eaf0O3u7e6bbNTVBm9agOaxwbIYR9cPR8yG92OvpxEUIUjKNnhGSncFQ2dyOIwWBAo9EYv1dKodFojP8+6vHvHZWbW0AO6/2zXZ8f47eP5/Ldy5x95SwjGo3IslGfnapeVZnUYhLHRh7j0PBDKBQ159dkwZEF6YbpFyQorXFshBD2wdHzIb/Z6ejHRQhRMI6eEZKdwlHZXMO+TJkyREVFGb//559/8PX1xcvLi9jYWFJSUhuEUVFRmQ7ld0QBAaFotZlPEqjVehAQMN6k+1tzeg3bL29nde/VGa6uazSafHWoVPaszOedP2f34N2sO7OORosbsf/afqBgQWnpYyOEsB+2lA/5zc7s5Dc7bem4CCFsjy1lhGSnELlncw378uXL4+bmxrFjxwDYtGkTrVq1wsXFhcaNG/PLL78A8OOPP9KqVStrVtVifH374enZPkOYaLUeeHl1wNe3r8n2df6f87y29TU29NlAySIlTVZumjp+dfh1yK9MbjGZ/j/0p//3/XH2HJLvoLTksRFC2BdHz4f8nmQ6+nERQhSMo2eEZKdwVDbTsB8xYgRhYWEAfPzxx7z//vt06tSJ+Ph4Bg8eDMC0adNYt24dXbp04ejRo4wbN86aVbYYjUZLUNAPBAYuplixRri4+FGsWCMCAxeb9NEa+hQ9L2x4gdltZ1O/TH2TlJkZjUbDC0EvcP7V8zxR6gk6/DCDnXergMY93Xa5CUpLHRshhP1x9HzI70mmox8XIUTBOHpGSHYKR6VRSilrV8ISbty4Qbt27di9ezf+/nIPTGbmHprL9svb2TZgW7phTzkNgSroR+iM7gzDNw9HY7jHG9WdKOvyD25u/gQEjMfXt68EpbBpjpwtjvzeLMHc2ZlahgGdbg0REXNJTLwh2SnsgqNni6O/P3OT7BQiczlli1VmxRe256H+ITP3zeTQ8EMWn5Swtm9tDgw7wBd/fsHL+97j444f82L9Fy1ah9xK/UOwmoiIeSQmRuDmFkBAQCi+vv3kD4EQwuI0Gi1+fv2zfHKIrZDsFELYEslO4YikYS8ACI8Op2zxsgSWDsyw7tGe0bRGv6kHejhpnXi92euEVA2h63dduRRziRnBM9DaUGgpZeD06V7pnn2q1+sIDx9FVNQGGYYlhEjHEtlpDyQ7hRB5IdmZSrJT5JV8GgoJpQxERq7i6NHGHDjgx9GjjYmMXIVSBgDC/wmnRukaVq4l1Chdgz+G/8GvV3+l++ruRMVF5fyiXMjp/eeGTrc6XbimMRjiiInZiU63xiR1FULYBlPkhr2T7BRC5FVhz05TvX/JTpFX0rAvBNJ6/MLDR/HgwTH0eh0PHhwjPHwUZ870RikD4dHh1PC2fsMewMfDh71D9lLHtw71F9Vn99+7C1Rebt5/bkREzMsQrmkMhjgiIuYWqJ5CCNthqtywZ5KdQoi8KuzZacr3L9kp8koa9jbMkj1+4dHhmQ7Dz1gnZZHhUC5OLnzQ/gOW91jO4B8H89but9Cn6PNVlql6PBMTI3JYfyNf9RNCmJYtXmW2VHaakmSnEIWLZGfBmfL9S3aKvJKGvY2ydI/f+X/O28RQ/Md1qNKBv0b9xV93/qLlspZc/fdqnsswVY+nm1tADutl5lshrE2uMpuOZKcQhYdkp2mY8v1Ldoq8koa9jbJ0j9+dB3coV7xcvupqbr4evvzc/2d61+xNq2WtOBd1Lk+vN1WPZ0BAaIZnnqbRaj0ICBifp3rZu8J+D52wTXKV2XQkO81DslPYIslO0zDl+5fsTE+yM2fSsLdRlu7xc9I4YbDhXwytRsuE5hOY2XYmwSuCORRxKNevNVWPp69vPzw922cIWa3WAy+vDvj69s11nexdYb+HTtguucpsOpKdpifZKWyVZKdpmPL9S3b+j2Rn7kjD3kZZusfPWetMsiE5T3W0hsH1BrOsxzKeWfMMWy5sydVrTNXjqdFoCQr6gcDAxRQr1ggXFz+KFWtEYODiQvfIEZmpVdgqucpsOpKdpifZKWyVZKdpmPL9S3b+j2Rn7hSeT4SdsXSPn5PWyS4a9gCdq3VmS78tjPhpBMv+Wpbj9qbs8dRotPj59adx46M0b36Hxo2P4ufXv1CFK8g9dMJ2yVVm05HsND3JTmGrJDtNw9TvX7IzlWRn7hSuT4UdsXSPn7PWmRRDiqmqb3ZN/Zuyd8heZuybwfv73892xlTp8TS9wn4PnbBdcpXZdOQYmJ5kp7BVkp2mUdjfv7lIduaOs7UrIDLn69sPnW59hmEnBe3x8/Prn+l6Z60zekP+HidnLYGlAzkw7ACdV3Um5mEMH3X4CI1Gk+m2Ob1/kTdubgHo9bps1jv2PXTCdpkyOyU35BiYmmSnsFWSnaZT2N+/OUh25o50G9koS/f4uTq5kpSSZNIyLaFc8XLsHbKXnX/vZNreadauTqFR2O+hE7ZLrpYIWybZKWyVZKewZZKduSNX7G2YJXv83JzcSExONPt+zMGzqCc7Bu2g9fLWuLu4M6nFJGtXyeGZekSJEKYkV0uErZLsFLZMslPYKsnO3JGGvQDAzdmNxBT7bNhD6rPudw/eTatlrXB3cWds07HWrpJDS+vZ1+nWEBExl8TEG7i5+RMQMB5f377Ssy+EEJmQ7BRCiLyT7MwdadgLIPWKfUJygrWrUSDlipdLbdwvT23cv9TwJWtXyaFJz74QBadP0aOL0xEZF4kuTse9hHvcT7yf7itOH+buB0IAACAASURBVEdSShJ6gx59ih69QW+8dcpJ44RWo8VJ64STxgknrRNFnYvi4eKBu4u78auYazFKFSmFZ1FPvIp64VnEE8+inngW8cRJ62Tlo1C4SHYKIUTeSXbmTBr2AoAizkXsdij+oyqWqsiuQbsIXhFMUeeiDKg7wNpVMimlDOh0q4mImEdiYgRubgEEBITi69tPeiuFsEH3E+9zIfoCl2Muc+XfK1y5e4W///2bW7G3iHwQyb3Ee5R2L42fhx++Hr54FvWkuGtxSriVoIRbCQJKBuDh4oGrkysuTi64aF2M/9egIUWlkGJIwaAMpKgUkg3JJCQnEK+PN37p4nT8ffdv7ibc5W7CXWIexnD3Yer/7yfex7uoN2WKlUn35V/Cn4olK1KxVEUqe1ammGsxax/KfJPcFEKIvJPstD/SsBcApKiULGeUtzVp9czqEXfVvKuxY9AOglcE41fMj/aV21uyemajlIHTp3ulu79Ir9cRHj6KqKgNMrmNEFZ2L+Eex28f58itIxy9dZSjt44SGRdJNa9qVPGqQuVSlalXph49a/TEv4Q/fsX88C7qbZEr5lnlZrIhmai4KO48uJPu62zUWbZe2srVf69y5e4VSriVoKpXVWqWrkktn1rU9q1NLZ9alC9e3qb/dkhuCiEKIqdzTkcl2WmfpGEvALh+7zoVSlawdjVMppZPLdY/v57n1j3H1gFbaVSukbWrVGA63eoMk4YAGAxxxMTsRKdbI8OThLAgXZyOX6/8yp4re/jt2m/cuH+DemXq0aRcE54JfIYZwTOo7l0drQ2f/DhrnSlbvCxli5fNchuDMnAr9haXYi5xLuocZ6POsuXiFs5GnSUuKY4g3yDql6lv/KrjW4eiLkUt+C6yJrkphBB5J9lpn6RhLwC49u81KpasaPb9WLLns1XFVizuvphuq7vx24u/Ud27utn3aU4REfMyBGwagyGOiIi5ErJCmFFCcgK7/t7Frr93sfvKbiLuRdCqYivaPtGW0U1GE+QbhLPW9H9WrX3FSKvR4l/CH/8S/rSp1CbdupiHMZzWneav239x6MYhFh5dSPg/4Tzh+QSNyzXmyXJP0tS/KXX96uLq5GrxuktuClF4WTs77Zlkp32Shr3gXsI9kg3JeBX1snZVspTZUM9Hl2UV2j1r9CTmYQwdv+3IgWEHKF+ivNnqaG6JiRE5rL9hoZoIUXjcS7jHzxd/ZuP5jey8vJN6ZerRuWpnlj6zlIZlG5qlIW8q+c3NvPAq6kWriq1oVbGVcVlSShJno85y5OYRDt88zKJji7h89zJ1/erStHxTmgc0p2XFlpQpVqbA+8+J5KYQIq8skZ22TrLTPtnuGYmwmGv3rlGxVEWbvk+yIIY1GEZUXBQhK0PYN3SfTXdgZMfNLQC9XpfNen8L1kYIx/Ug6QHrz6xn7Zm1HIw4SOtKrXm2xrMs6LIAHw8fa1fP5rk6uRqH5Y9oNAJIPabHbh3j0I1DfHPqG0ZtGYW3uzctKrSgZYWWtK7YmsqelU3+d0hyUwgh8k6y0z5Jw17w992/sxyGb4phTKbo+Xx0m/zU6T/N/4MuTkf31d3ZPXg3RZyLPFJ2wWf9tMTMoQEBoYSHj8p0aJRW60FAwHiT7EeIwups1FnmHZrHhnMbaFmhJcMaDGP98+sp7lY8z2UVNDttITezLztvmVfMtRitK7WmdaXWQOp9+2ejzrLv2m/8fHYpE7e/jIsmhWa+Xjxbewi967+Lu6tHgespuSmEfZHstGw5WZHstE+2O6OPsJi1Z9bSsUpHa1fDrDQaDXM6zqF88fK8vOVlY0CnzfoZHj6KBw+OodfrePDgGOHhozhzpjdKGXIs2xRl5Iavbz88Pduj1aY/2dVqPfDy6oCvb1+T7EeIwkQpxW9Xf6Pbd91ou6ItFUpW4Nyr59jcbzN9avfJV6Pe0Zki87QaLbV9atGyyE5eDzjJuqZ63g8yUMb5H+YemofvnFL0WP0My08sJ+ZhTL7rKrkphLAVpjpftMR5p2SnfZKGfSEX+SCSrRe3MqTeELPtQyll/MpumblpNVqW9VhGmC6Mqb9OBXI362dOTFFGbmg0WoKCfiAwcDHFijXCxcWPYsUaERi4WB47IkQ+/HnzT9p9046XfnqJ7tW7c+X1K0xtPdUi937nxFZyMzOmyrxHy9FooKIH9AmAefUMrGnmSoh/AJvDN/PEZ0/QeVVnlh5fSnR8dJ7qKrkpROFS2LKzIOVkR7LTPslQ/EJu2Yll9KrZC8+insZltj5pSEH27+HqwbYB22i9vDXFXYvTrsj6As/6acmZQzUaLX5+/fNdniVuGRDC1l2IvsDbe97mYMRBprWextD6Q3Fxcilwubacnabct6kyL7tyijnF82TRw7zywlEeJD3gl4u/sP7sesbvGE/T8k3pF9SPXjV7UbJIyRz3U9DcBMlOIcxJstN02WnK804557Q/0rAvxFIMKSw6toh1z62zdlUsysfDh52DdtJqeSt0vjq6Z3NxLjezftrLzKFpQ7ce7eXV63WEh48iKmqD9MAKh3cr9hbv7n2X7899z5tPv8mKnitwd3G3drXsjqkyL7flFHMtRp/afehTuw9xSXH8cvEXVoWtYtz2cYRUCWFAnQF0rtbZbI/Tk+wUQpiCpbPTmiQ3rcMqR/Snn36iS5cudOzYkVWrVqVbd+7cOXr06GH8atmyJd26dQNg48aNtGjRwrhu3rx51qi+w9h+eTveRb1pUr5JuuXmHMZkC0OhAMqXKM/OQTtZeS2R7Xey3i43s366uQXksN42Zg611C0DQtiaZEMy8w7No+7CupRwK8GF1y4wqcUkkzfqzZWdtpKbaUyVefkpx8PVg+drP8+PfX/kyutXaF+5PZ8c+oRyn5Rj9JbRHLt1LFf7zgvJTiHMS7Izbb35stPSJDetw+IN+8jISObNm8d3333Hjz/+yNq1a7l06ZJxfc2aNdm0aRObNm1izZo1lCxZkunTpwNw+vRpJk2aZFwfGhpq6eo7jITkBKbsmcLrTV+3dlWsprJnZTb0mMniKxqOZDI3U25n/QwICM0wuUhey7CE3AzdEsLR3Lx/k7Yr2rL5wmYODj/InI5z7PaRl7bCVJlX0HK8inoxstFI9g3dx7GRxyhfojy91/Wm+dfN+f7s96QYUnJVj5xIdgohTMFWstMSJDetw+IN+4MHD9KsWTNKlSqFu7s7ISEhbNu2LdNtFy1aRJMmTWjcuDEAYWFhbNy4ke7du/Pmm29y7949S1bdobyx/Q2qeFVhYN2B1q6KVbUIfJOPmz3N7PNwPf5/y/My66e9zBxqiqFbShmIjFzF0aONOXDAj6NHGxMZucpkM/8LYUo7Lu+g8ZLGdKzSkd2Dd1Pdu7q1q+QQTJV5pszOiqUqMqXVFC6NvcT4ZuOZ+8dcqv23Gp/98RmxibG5Liczkp1CCFOwxew0F8lN67B4w16n0+Hj42P83tfXl8jIyAzbxcbGsm7dOsaMGWNc5uPjwyuvvMLmzZspW7YsM2bMsEidHc33Z79n2+VtfNX9q0wnLHmUrQ1jMjWNRsuLbfYxrflIJp92Raf3zvOsn/Yyc2hBh25Z6rF+QhRUiiGFqXumMnTTUFb3Xs2UVlPQWvj30JGz01SZZ47sdNY607tWbw4MO8B3vb/jQMQBKn9emel7p+d5Rv00kp1CWI5kp+XKMSfJTeuw+OR5BoMhw0yXmTUuN2/eTPv27fH29jYumz9/vvH/L730Eh06dDBvZR3QlbtXGP3zaLb035Kr2YQLA41Gy7jWiyji0YA39s9i56CV+JWukecyCjrrsrkFBIQSHj4q06FRuRm6lZv7pWz5/YvC4V7CPfps6EOKIYXjI4/jV8zP2lVySKbKPHNmZzP/Zqx7fh0Xoi/w0YGPqPbfagxrMIzxT42nXPFyuS5HslMIYSr2kJ2mILlpHRbv0ilTpgxRUVHG76OiovD19c2w3a5du+jSpYvx+9jYWJYvX278XimFk5OTWevqaPQpevp934+JzSfyZPknrV0dm/Ny45eZGTyTtivaEhYZZu3qmFxBh27J/VLC1l2/d50Wy1pQxbMK2wZuk0a9AKC6d3W+euYrTo0+RYohhaAFQby85WWu37ueq9dLdgohRN5IblqHxRv2Tz/9NIcOHSImJoaHDx+yY8cOWrVqlW4bpRRnzpyhQYMGxmXu7u589dVXnDx5EoCVK1c6zBV7c9xDklmZr21+Bu+iXoQ+JZMOZmVI/SHMC5lHh287cOLOCWtXx6QKOnTLHh6vIgqXR3Pu2+3eNPmyKr2r1OWLzv/FWZu/AWlyT5/j8i/hz7xO8wgfE45XUS8aLGrAuG3jiHmYyeypj5DsFI7GUuedkp2Fl+SmdVh8KL6fnx+hoaEMHjwYvV7Pc889R926dRkxYgRjx46lTp06xMTE4OLigpubm/F1Tk5OfPrpp0yfPp2EhAQqVarERx99ZOnqm5w5nvOYWZlfX9KxR6fh27adyf6uevNIu93CmvdN5bYOLwS9gJPWia7fdeX3ob/zhOcTlqieRRRk6JabWwB6vS6b9dZ/vIooPB7NuesP4hh/EkZWhrZFNnH27HMmy05rP3fXnrLTXvh4+DC73Wxeb/o60/dOp+b8mrwX/B7DGwzHSZv5SEDJTuEoLHXeKdlpG3WwJslNy7PK7Ardu3dny5YtbN++nREjRgCwZMkS6tSpA4C3tzcHDhzI8LrGjRuzceNGtm7dysKFCylevLhF620O5njO4+NlromAnZHwST2FIe43sz47UqPR5Dghnz14rtZzTG4xmU6rOvFP/D8W2aetHzt7eLyKKDzScu52fBxvnoIXK0EHP9NmZxpLPHfX1n//bVl+j51fMT8WdlvItgHb+ObkNzT9qimHIg6ZvH6SncKWWOK80xRl5pZkZ/7Y+nGT3Mwf60+baEfMMczIHPeQPFrm2gj46RZ8Ug+8XO3nvhRbCJwxT46hT60+NP+6Oef/OW/VutgCe3i8irBN5srO6ITURv1z/tC17P/WmSI7HyfZ6bgalG3A/qH7GddsHL3X9eaVn1/hXoLpHqcr2Snyyx7PO01VpiVJbtoeyc38sfhQfHtlrmFG5riHJDExAqXgm2uwWwef1gcft0fXW+a+lMxC8vEnIth6Hd5r+x6VSlWi1bJWLO+5nC7VumS7fX4lJCeAH1Aa3t//PvH6eBJTEklMTkz9NyURd2d3avrUpJZPLWr51MLPw8+if4jS7pfS6dYQETGXxMQbuLn5ExAwHl/fvjbxeBVhe8yVnbEPr/POGWjjk9qwf1x+szP79ZKdlqyDJWk0GgbWHUjXal2ZtGsStRfU5vPOn9OrZi8TlC3ZKfLO3s47TV1mfthCbtlCHRyB5Gb+SMM+l8z12AVz3EPi6urP/HAdh2NSG/VergUvMzs5hZi9G95wODVK1+D59c8zrtk4Jjw9oUDv7+7DuxyMOMiBiAO8//X7UBooATwHRMFbM94CPZAM8z6eh5uTG27ObsQmxnJad5p1Z9ZxNuosBmWglk8txjYdS5/afQDz389l649XEbbHHNmplOKT8BS8XGFopcy3yU/OWfqePkfPTnMy9cnzo9m5qPsi9l/bz8gtI/n21Lf8t/N/8S9RsJ+9ZKfIK3s675TstA/m6HQw53mn5GbeScM+l3IzzCg/H7yCPufxccmGZP57pSTH/9Uyt56Bki4FL7OglFK5+sU3R+A8+pqChE/zCs05/NJheqzpwY37N/is02f5+iPy1fGveHPHmzQu15gWFVrAcSAKuAtkMrJuXLNxWZYVFRfFkVtHCN0eypLjS5jaamqe62MvlDKg060mImIeiYkRuLkFEBAQiq9vP+m1tXHmyM7FxxZzLaE4H9dOQKuJz7A+vzln6jwuKEfITnvVsmJLTow6wQe/f0CDRQ34ovMXvBD0grWrlWeSnfbLXs47zVVmQeQmO811Zb2wZ6ejsNfstN2a2RhzDTMy5T0kD5Ie0GNND6KSXFnephOebpa5L0UpZfzKbpm9CygZwJ4hezgYcZCJuybm6b2lGFII3RbKnINz+HPEn+wavIvpbaajzinUPwqVkvdj5+PhQ5dqXTg9+jT9gvoxbNMwGApUdqw/ImnDEcPDR/HgwTH0eh0PHhwjPHwUZ870lkfp2DhTZ+eVu1eY8usU1vb5mXKlO5j0/jtL39NXWLLTHCxx7Nyc3ZjWZhrbB27nrT1vEbotFH2K3iRlW4Jkp32zh/NOc5aZHcnO/JHjljv2nJ3SsM8lN7eAHNbnb5hRQZ/zmObK3Su0Xt6assXKsrnfTzRt8FOBy7Q0ewicUkVKsWPQDvZe3UvwimCO3z6e42vuPrxL99XdCdOF8cfwP6juXd2kdXJ1dmV4w+FcDr0Mx4DOoB2tRdNTg6athi+PfslP4T9x/PZxYhNjTbpvS7DmbLui4EyZnQZlYOimoUxsPpFavrVNkp2PMlUeW5o9ZKctSpsw69GrdJkta1i2IUdHHOVizEXaftOW27G3rVHdPJPstG+2ft5p7jLNTXIz/3KbnfbKnrNThuLnkjmHGRX0HpINZzfwys+vMLnFZMY1G2f8pZL7UtIzVVB7FfXi0PBDLP1rKV2/60qnqp2Y1XYW5YqXS7evwzcPs/jYYjae38iQekOY02EOLk4u2ZRcQAbgFBAGVAI8gRJw7NYxNsdu5mbsTSIfRLKsxzI6V+tsliqYY+iSuYYjCsswZXZ+8ecX6A16QpuFAua5/07u6ctITnLBs6gnm/ttZta+WTRe0pjVvVfTqmIrk5Uv2SkeZ8vnnZYq095JdpqfZGd60rDPJV/ffuh06zP04FjjsQtpDff4pHjGbx/Pjr938MuAX2hcrrHF6pCVwhJiTlonRjYaSd+gvszeP5u6C+syrtk4hjcYzg/nfmDx8cXEJcUxstFIwseE4+vhm2OZJrufS4H6O/Oy9l3bx4AfBtA/qD8z2840aUeDPc3gKyzHVNl5IfoCM36bwaHhh3DSOuWrLrZ8v6Mt1sleWOpeWK1Gy9TWU3my/JM8v/55JjafSGiz0AJfoZLsFJmxxfNOW8wpW6yTPSjIcbOVeQQkOzOyvbExNsrmhhl5Q7OlzYhJiOH4yOM20ah/XEGG6tjLUKgSbiX4oP0H/DniT05GnqTSZ5XYd30f80LmceG1C/yn+X9y1ai3lFYVW3F85HHCdGG0Wt6KW7G3TFa2uYYumWs4orAMU2SnUophm4bxTut3qOZdzQK1tq7CkJ32LKRqCIdfOsyqsFW8uOnFAt93L9kpMmNz5512IL/ZKblpnyQ7M5Ir9nlgC8OMlFJQB+gEoxuPZlSjUQ5xP4u9q+xZmfXPryfZkIyzNvtfK2vPtOnj4cOW/luYvX82zb9uzvaB201y3789zeArLKug2fnzxZ+JTYplzJNjTFwzYU+snZ2PqlSqEvte3McLG17gufXPsfa5tRRxLpKvsiQ7RVZs4bxT2D9byk5TkuzMyH5/moWMRqNBU0mDdqQWngJWwegmo9FqtTbbsC+ME5PkplFvzpk2c3tstRotU1pNYWqrqbRe3prPD3/Ob1d/I+ZhTL73bU8z+Ar7oZRi9v7ZvNXiLbT5mtTJ/ib5KYzZmRNbyc5Hebh68MMLP+Dm5MYzq58hXp/x0Yu5IdkpbJFkp2Owxew0FcnOjKRhbwfO6M5AP6AncBhYAphuBLWwIFubaXNYg2GsfHYlZ6PO8taet3jisycoP7c8nVZ2YvKuydxPvJ/rsuxpBl9hP/Zd20dUfBTP1XrO2lURVmRr2ZnG1cmV73p/R9niZem0slOeMjONZKcQwlxsNTtNQbIzIxmKb0F5nWDiUswlPvz9QzaFb2Lua3N5pckruDm72fQkJiJ7tjjTZrvK7WhXuR2Q+pm6fu86Ybow1p1ZR4dvO7BtwDZKFSmZ4zAue5vBV9iHNlPbwFlwei1/E+bZyiQ/omBsMTvTOGudWdZjGa/+/Crtv2nPtoHb8CrqBeRuCKxkpzCHguadZKdjsOXszI5kZ/7YbpdDIRWbGMvXf31Ny2Utaf51c3w8fAgfE07oU6G4ObtZu3r5VpiHQT3K1mfa1Gg0VCxVkW7Vu7Gi5wqaBzSn3Tft2H+sa47DuOx56JKwTcdvHwdf4KS1a2I9kp2pbD07tRotC7ouoFXFVrRd0Zbo+OhcD4GV7BTC9CQ7U9l6dmZGsjP/pGFvI87ozvDKz69Q4dMKbArfxBtPvcGN0BvMbjcbz6Ke1q6eMBF7mmlTo9HwScdPaFHWnxf3bifyYfbDuOx56JKwTZ8c+gQOASnWromwNnvITo1Gw5wOc+hYpSNdv+vKtVsrcjUEVrJTCGEu9pCdj8vt7QOSnRnJUHwzy2yCEeMyX5i2dho/nPuB6IfRjGg4gjOvnKFc8XLZlik9kPYru2FDDx/CzJnH2LXLChXLgkajYVDZmyT+qxh7Aj6qAwHu/1v/+DAuex26JGyLRqMBNyAUOPHIsv9niqGlwr7YS3ZqNBo+bP8hAzcOZMTPbzC5WhzaTOYZk+wU5pDtOSe2m51KKe4l3uOf+H+MX/cT7xOvj+eh/mHqv8kPeah/iEKh4f8n8fv/f521zri7uOPu4o6Hiwcerh64u7hTqkgpSruXprR7abyKeuU4wbEjyik7a9a0vRne83L7gGRneoXvE25tfqQ+rq4m4AT3E++zsOtCngp4Kl8zPgvzMvV9Zb6+/dDp1mfoidRqPTh6NI49e0yyG5NKSrpBvwpQwgVCT8KsIAgs/r/1tjiMSziA2sDfwENrV0TklTnux7Wn7NRoNCx9ZilPflGCr6/CS09kvp1kpygs9Cl6LsZc5MrdK1z992rq173Uf2/cv0F0fDRFXYpS2r00Pu4+eLt7U9KtJO4u7hR1LkpRl6K4u7jjWdQTDRoU/z/T/f//m2xI5u7Du9y8f5M4fVzqV1Jcus6Cuw/vUrJISUq7l6Z88fIElAwgoETqV4WSFahQsgJVvKrk+7GVpmDJ7Hz4EI4ehU6dbG+4uj3ePmArpGFvZmn3+Oz6excdZ3SE0jC5y2R61+xNw7INbfaRIcI80oYN6XRriIiYS2LiDdzc/AkIGE+bNgOwxQuKbm4B6PU6upaFki4wKQxm1IY6JdPW294wLmHflFK0+LoF/2n+H3qs62FcJgove8vOIs5F+KRJTV78/RT+RaFTmYzbSHYKU7P2hHdKKSLuR3DizglO604TpgvjtO40l2IupTacPatQsWRFKpWqRONyjalUqhL+Jfzx8fDB1cnVrHVLMaTwb8K/RMVHcfP+Ta7fu07E/QiO3DrCD+d/4Oq/V7n27zXKFi9Lde/qVPeqTnXv6tT0qUk9v3r4ePiYtX7mklV2zpx5jD17YOpU27uomHbemfV6yc6sSMPejJINyaw/s56PDn5EUkpS6gRQp2H2J7OtXTVhRY8OG0r9wxsJDHhkfcGHzZnSo8O4WpQGNy28cwam1YKGXgWbdVSIzFyKucTFmIt0rtrZ2lURNsTesrNu1f/wwf0RvP7XQ8oUgfql/reuoDM2C2ELklKSOHHnBAcjDhq/9AY9jco2Isg3iC5Vu/Cfp/9DTZ+aVr0SDuCkdcLb3Rtvd29qlK6R6TbJhmSu/nuVC9EXuBB9gXP/nGPDuQ2cijxFUeei1PWrSz2/etQrU4/G5RpTzauaXVygS8vOMmXS8jLykXW2lZtg3tnuHZ007M1k+6XtvPzzywSUCGBm8Ew6V+uM06v5e1xTYWTNR6uY6x41e/X4MK4mXqmN+nfPwodN69GyEM46Kszrm5Pf0C+oHy5OLtauit2xVnZKbmbk69uP+v7rmZq4nRlnE/isfuocJYV5xmZh/67+e5WN5zbyy6VfOBRxiCpeVXja/2m6V+/O++3ep7JnZbto7D7q0dys6lWVql5V6VKti3F92kiEk3dOcjLyJBvPb+St3W8RmxRL0/JNaVq+KS0qtODpgKcp6lI0X/vOallhzc6sbr2S7MyeNOzN4PCNwwzcOJDVvVfTvnJ74/LC+MuZHXkuqvWHzeVGZsO4Wvj7802lrgzfuZByAb/QrXo3a1dTOJAfzv3AV898Bdje74MtsNWssCR7yk5f3zVEpkxm5vlbrGhRlycqvoGvb99COWOzsBxT/j7cvH+T9WfXs+b0Gi7fvUzPwJ682uRVNjy/gZJFSppsP+aW36zQaDTG+/C7B3Y3Lr8de5vDNw/zx40/mPrrVMJ0YbSo0ILu1bvTtVpXKpaqaNL6F5Q95CZkf+uVZGf2pGGfA6UM6HSriYiYR2JiBG5uAQQEhOLr2y/TD9blmMv0XNuTZT2WpWvUC/uRXfBpNKkzsNpiEJpTVrOObvHpSvfV3VnYdSG9avayUu2Erclrbj7qxv0b3HlwhyblmliotsIUcjphtOWTSHNKy873e/UjbHU3tsY15l2ZvVlkoSDZaWoGZWD7pe0sOLqAA9cP0KNGD6a3mU67J9rJaKr/V7Z4WXrW6EnPGj0BuJdwjx2Xd7Dl4ham7Z1G2WJl6Va9G88EPkPT8k0zvTov55yZk9nu80ca9tlQysDp073SDQXR63WEh48iKmpDhmck/hP/D51XdWZ66+lyBTMfZDiS/Xmy/JNsHbCVLqu6kJSSRN8gGR5V2OU1Nx+3/dJ2OlTpgJNWbl3KLclO26fRaFjSfQkNFjWgW/VuNCkvHVcivYJmp6lEx0ez7MQyFh5dSEm3krza5FXW9F6Dh6uH2fdtSebIzZJFSvJ87ed5vvbzpBhS+PPmn2y5sIWhm4YSr4+nT60+9Kndh8blGtvd7QrCPshYhmzodKsz3N8Bqc9QjInZiU63xrjsof4hz6x+ht41ezOq8ShLV9VupPU+Phpoj39vzwryXtKeoGBvGpZtyM5BOxm/fTwrT620dnWEleUlNzOz4+8ddKzc0ZxVtEuSnVmzl+wsV7wcn3X6jCE/DuGhGjIK6gAAIABJREFUXp7jKNIraHYW1N93/2bE5hFU/W9VTkWeYlWvVRwbeYzhDYfbdaM+q+w0NyetE08FPMWsdrM4+8pZtvTbQhHnIgz4YQBVPq/CpF2TCIsMK/B+8pud9pKbIm+kYZ+NiIh5mc7ICKlBGxExF0h9hMbAjQN5wvMJZrWbZckqOpzHgybte2uFz+PDodJk9oeiMKvjV4ddg3cxcddElp9Ybu3qCCvKbW5mRinFb1d/I/iJYHNVz2HZUnam7Te7zojCmp19g/pSx68OU/ZMsXZVhI0pSHYWxKWYSwzdNJQnlzxJueLluDDmAt88+w3N/JsVit9TS+SmRqOhjl8d3mv7HuFjwtn4wkY0aOjyXRcaLW7EF39+QczDGDnnFAUmQ/GzkZgYkcP6GwC8vedtouOj2T5wO1qZ0CFbcs+l46rlU4s9g/fQ/tv26FP0jGg0wtpVElaQ29zMzKWYS7g5u1GpVCUT18r+SXY6jvld5lPvy3r0qtmL5hWaW7s6wkYUJDvzIzo+mil7prD+7HrGPDmGi69dxLOop0n3YQtsLTs1Gg31yqQ+Mm9m25nsvrKbZSeWMWXPlNSJ+coCt61WPWHnpBWaDTe3gBzW+3M26izLTyxnQ58NuDm7Wahm+Sc9fnmXWQ/uo8vkqtT/BJYO5NchvzJz/0wWHFmQ69cpZSAychVHjzbmwAE/jh5tTGTkKpQymLG2whxyk5tZ+evOXzQs29DUVTKJwvj7XFCSnZkr7V6auR3nMvrn0SQbkgtUlmSn4yhIduaFUoqVp1ZSa0EtnLROXHztItPbTDdbo97Rf58LwknrRMcqHVndezVXXr9CXd+6lH+zPJ1XduaPiD+M2z2epYU1O03FkXPTKg37n376iS5dutCxY0dWrVqVYf0XX3xBcHAwPXr0oEePHsZtbt26xYABA+jUqROjR48mLi7zIUumEhAQilab+X1FWq0HAQHjWXFiBS/Wf5HS7qWzLcuRP0TmIPf+2K+qXlX5dcivfHTgIz4//HmO26dNGBQePooHD46h1+t48OAY4eGjOHOmt/yO2Jnc5GZWwiLDqONbJ90yyc68key0D31q98GvmF+uMjIrkp2OpSDZmZnMsvPC9cX0/74fs/fPZuuArXzR5QuHvEqfV7aQm55FPZnQfAKXx16me/XuPL/+eRgAmKY/R/w/R89NizfsIyMjmTdvHt999x0//vgja9eu5dKlS+m2OX36NHPnzmXTpk1s2rSJAQMGAPDuu+/Sv39/tm3bRlBQEAsW5P6KYH74+vbD07N9hqDVaj3w8uqAd+nnWRm2kkF1B2VbjqN/iPLLFoLUFHK6KmVPTNXbW9mzMr+9+BufHf6MTw5+ku221p4wSJhWTrnp65v1kxPCdOkb9pKdmbPHbMmMo2RnfnJTo9Ewv8t8Zu+fzc37N/O1X8lOx1KQ7HxcZtn5+41jtPruZXj4J0dG/Gmzo6PMyR6yxc3ZjdFNRnPxtYtwHngOQlaG8MeNrK/gZ7XM1lljhIGj56bFG/YHDx6kWbNmlCpVCnd3d0JCQti2bVu6bU6fPs2iRYvo3r07M2bMIDExEb1ez5EjRwgJCQGgV69eGV5nahqNlqCgHwgMXEyxYo1wcfGjWLFGBAYupnbt79lz9VfKFitLbd/a2ZZj7Q+RDNkxHXsLTWuqWKoiv734G4uOLeL9/e9nuZ21JgwS5pFTbmb3uKYwXRh1/P7XsJfsdBySnRlV967OiIYjmPJr/ibSk+x0LAXJzsc9mp16Ayz5G947B69XU4yuqOPB3c1mfCeSnabg5uyGOqpI/DiR3jV702d9H55b9xwXoy9au2p2zdFz0+KT5+l0Onx8fIzf+/r6curUKeP3cXFx1KxZkwkTJlCxYkUmTZrEggULGDBgAMWKFcPZObXKPj4+REZGmr2+Go0WP7/++Pn1z7BuxckVDKk3JMcycvMhyqx8W2ILE44I++Nfwp+9L+6l3TftSEpJYlqbaRm2sfSEQcL8ssvNrDxIesDt2NtU9apqXCbZKRzdpBaTqP5FdU5FnqKuX908vVay0/HkJzszk5adkQkw7SyUcoEljcDLVbLT3rg6uTKy0UgG1R3EZ4c/46mlT9E3qC/T20zP8TZgkZGj56bFr9gbDIZ0vXVpE+ik8fDwYMmSJVSpUgVnZ2eGDRvGb7/9lmE7sMxzKLOilGLbpW30qtkrx22t/SFylCE79sAej6m5e9bLFS/H3iF7WX5yOdsvbc+w3lITBgnbdjH6IlW8quCs/V9/s2Rn4WFvx9RUuVmySEneavEW0/dOz3MdJDtFVhITI7iTAONOQuvS8H5QaqP+f+slO+1NUZeiTGoxifNjzqNBQ52FdVgdthqDwWBXx9TaozkcPTct3rAvU6YMUVFRxu+joqLw9fU1fn/r1i02bNhg/F4phbOzM15eXsTGxpKSkpLp6yxNF6cDUhstOSnIh0iGLQlH4FfMj/ld5vPqL6/yUP8w3TpTTxgk7NP1e9epULJCumWSnaIwGNFoBP/H3p3HRVX1fwD/3BmGYdgXmUFhcEVQURFxJXED9z1zX9I0TetJMp+fZaVWppk+mqaWS5lLprnbY+65mwmaoinuiqiAArKvM78/eCAQhtnu3GXm+369fBUzc+/9wgwf7rnn3HPOJpzF1eSrRm1H2Ul0SS1W4r3LwGt+wHB/4OUopOwUrxqONbC813LsHrob807Nw6Btg/As5xnfZYmGtecm5w379u3b49y5c0hNTUVubi4OHTqEiIiIsucdHBzw1VdfISEhAVqtFps3b0ZUVBRkMhnCwsKwf/9+AMDu3bsrbMe1aynX0MS7iUHhJ9YPEd9X1Qg3uLqy3iugF1rUbIEvTn1R4XE2Jwwi4pWQkQC1a8WGPGUnESo2c9NR5ojottGVslEfyk5SlYcvHuLtmCQM9rPHIN/Kz1N2Woc2fm0Q+2Ys6nvUR8i3ITh85zDfJRmE79Ec1p6bnDfsVSoVoqOjMWbMGAwYMAB9+vRBs2bNMHHiRMTFxcHT0xOffvop3nrrLfTo0QNarRbjxo0DAMyePRvbtm1Dr169EBMTg2nTpnFdfplrydfQ2LuxQa8V0oeIhkERPn3d42t8G/stbjy7UfYYmxMGEfFKeFG5YU/ZSWzFW63ewuG7h42aGIuyk7ws4UUCOv/YGe+2m4mJzXpSdlo5uZ0ci7otwvoB6zFuzzhMPzgd+UX5fJclaNaem5xPngcAffv2Rd++fSs8tmbNmrL/7969e9ns9+X5+vpi48aNFq/PEH+n/I0m3tXPhl+q9EOUnPwzEhL+g/z8R5DL/aBWvwelclilD1FVVyVfnpeAC+WPQ5OYEDbUcqmFTyI+QaP/awRsALSFJZ8ntiYMIuKVkJGAHg16VHiMspPYCle5K6a2mooFpxdgXf91Ol/38ueJspOUepTxCJ1/7IyprabivXbvQaudRtlpIyLrReLy5MuYuG8i2qxtg82DNutdscuW2FJu8tKwtwbXn13H4MaDDX69NX+IiPXg4g/olFZT8K9F/wL0zztJbMijjEeVeuwByk4ifGzl5r/a/AsBywMw58UcqN2qn1+CkPIy8zMRuSESk1pOwnvtSobZU3baFi9HL+wYsgPrLq1Dx/UdsaLXCgwNHsp3WdWiizbs0zneoKCgAMuXL8cHH3yAEydOVHjus88+s3hhQpeUnWTQxHmm4Pv+E0IsSSqRArsA1AUSMxL5LscmiCHPn+c+N3vpHspOImaeCk+MajoKq2JW8V0K+R8xZCcAvHfwPYSrwzEjfIZJ21N2WgeGYTAhdAKOjT2G6YemY9UFyhJbo7NhP3fuXNy/fx/169fHRx99hNWrV5c9d/HiRU6KE7L0vHS4O7jzXQZnKNyJuSpMgFMM4Abg192PJsXhgBjy/EXeC7g5uPFdBusoO4kx3m79NtZeXFth9RCaUIw/YsjOvfF7cez+MSztsZTvUlhF2Wm6ZqpmODnuJBafW4zPTnxmkz9HW81NnUPxr1y5gr1794JhGPTs2ROjRo2Cn58fevXqZZMfkJfZWsOeENZdBdAZwB98F2L9xJDnL/JfwE1ufQ17QowR4BWAsFph+PnqzxjXYhzf5dg8oWdnUlYSJv06Cdtf2w4XuQvf5RABqedRD6fHn0aPTT2QkpOCpT2WQiLyieGIftW+w6VXNHx9fbF8+XLMnTsX165ds+orHYbIK8qDRquBg52DxY9FVyyJtag0rO8e4N3QG7ef36bPOAeEnOfFmmLkFOawemJK2UnE6p3W72D5n8vLPr80TJpfQs1OrVaLCfsmYFzIOIT7h7O6X/pcWQcfZx8cf/04/nr6F0bvGo3C4kK+S+KMreamzoZ906ZNMXPmTDx48AAAEBwcjE8++QQTJ05EUlISZwUK0Yu8F3B3cOc91ElF1j68xupogMGNB2Prta18V2L1hJ7nmQWZcLZ3pt4EHlBuCk/3Bt3xIv8FYp/E8l2KzRNydq69uBaJGYmY02kOr3XYKrFkp7uDOw6OOojM/EwM2DoAeUV5fJdELEjnWdTs2bPh4+ODxMR/Jrfq3bs3Pv/8c7i6unJSnFBlF2bDUebIdxmEiN64kHFYcWEFnuc857sUqyb0PM8qyIKzvTPfZRAiCBJGgrHNx2LjZWEs72vLhJqdSVlJ+ODoB9g4cCPspfa81UHEQSFTYMeQHXCwc8D4PeOtusfa1uls2MvlckybNg3t27ev8HiXLl1w4MABixcmZHYSOxRpivgugxDRKh0K1cq3FYY0HoIp+6fQHxoLEnqeF2uKIWWkfJdBiGAMaTIEO67vgEarqfC4tQ8jFRqhZucnv3+CMc3H0FrlxGAyqQybBm7CnbQ7+Pzk53yXwylbyk0a92gCe6m9Td2nImS2OuulNfmi6xeIS4rDz1d/5rsUwhONVlOyDCLhBOWm8AXVCIK7gzv+eESzi5KK4pLisDt+Nz6O+JjvUmyO2LNTIVNgz7A9WHtpLbZd28Z3OcQCqGFvAplEhkINNewJYYNCpsDGgRvx7oF3aV17G1WsLab76wl5yeDGg7H97+18l0EE5qPfP8KHr3wID4UH36UQEfJx9sHeYXsxdf9U/Jn4J9/lEJbpPZOqaujCixcvLFKMWMikMuqxFwhbnfXS2rSs1RLT2k7DgK0DkJabxuq+tVoNkpI2IyYmDGfOqBATE4akpM3QvjTE1RYINc81Wg0NxecQ5aY4vNb4NWz/e3ul4fhcoez8h1Cy8/LTy7iQeAFvtnyT82MT68nO5j7Nsa7fOgzaOggJLxL4Lsfq8Jmdehv2gwYNqvTYyJEjLVKMWMgkMhQUF/BdhmCJZUgSEZYPXvkAHWt3ROTGSBRrilnZp1arwdWrgxAfPwlZWbEoLExGVlYs4uMn4dq1V23uBFWoeV6soR57gLKTVNTYuzGc7J1wIfEC58em7KxIKNn5xekvML3ddChkCs6PLWSUncbrF9gP09pOQ7+f+yG3MJfvcqwG39lpp+uJsWPHIi4uDnl5eQgNDS17XKPRoGnTphYtSugc7Byg0WqQX5QPuZ2c73IIsQoMw+CrqK8QvCoYfz39Cy1rtTR7n8nJW5CWdgQaTXaFxzWabKSmHkZy8s9QqUaYfRyhE3qey6QympCUkJcwDIN+Dfvh15u/oo1fG06PTdlZQkjZ+TTrKQ7dOYQ1fddwelxivaa3m46YxzH48OiHWNJjCd/lWAW+s1Nnw37FihVIT0/Hhx9+iPnz5/+zgZ0dvL29LVaQGDAMAy9HLzzPfY5aLrX4Lof8j5iGQZGqMQyDznU64/j946w07BMSllQK11IaTTYSEv5jEyenQs9zBzsH5BZRjwEfKDeFrVdAL0w/NB2fdfmM0+NSdpYQUnZuuLwBA4MGwlXO/xKlxDqyk2EYrOi1AsGrgjE0eCja+rXluyTR4zs7dY59dHZ2hp+fHzZs2AA3Nzf4+vrixYsXOHfuHIqL2RkmK2ZeCi9ae7scsc8USoSjY+2OOP7gOCv7ys+v/t6x/PxHrBxH6ISe5wo7BfKK8vgugxeUnaQ67dXtcTv1NpKykjg9LmVnCaFkp1arxbpL6zAhdAJnxxQ6yk52eDl6YWn3pXhj7xvIL8rnuxzR4zs79d7UuGzZMsyePRuPHz/GhAkTsHPnTsyZM8eiRYlBDccaeJbzrNrXULgQYryOdTri1INTrNxnL5er9TzvZ/YxxESoee5g51DhHj/KTkJKyKQydK3XFQfvHOT0uJSdFfGdnacfnoaUkaKdX7tqX0fZSUwxpMkQ1Peoj/mn5+t/MakW39mpt2F//PhxfP755zh06BB69+6NDRs24MaNGxYtSgxKh+KTEtYyU6iYPM58jI7rO2LdxXV8l8IqpZMSvq6++OvpX2bvS62OhkTiVOVzEokT1Or3zD6GmAg1zx3sHJBXlGeTWUHZSfTp2aAnfrv9G6fHpOysiO/sXHdpHd5o8QY12suh7GQPwzBY2XslVlxYgWvJ1/guR9T4zk6DpiFWKBQ4e/Ys2rYtufeioIBmhPd29EZydjLfZRAb9t7B91DXvS4+PPYhNl7eyHc5rGrj2waxT2LN3o9SORweHpGVQlYicYKnZxSUymFmH0NshJjnUokU9lJ7mx2OT0h1ejTogcN3DnO67B1lZ2V8ZWduYS523diF0c1Hc3I8Ypv8XP3waadPMWX/FLowYga+s1Nvw97DwwNz5szB1atX0b59eyxatAhKpdKiRVlSXFw/VtYS9HXxRWJGYqXHxXLPj9DqIcZ7lvMMI5uOxO9jf8fs47Mx+/fZVhPGCjsFCosLzd4Pw0gQHLwTgYGr4ezcEjKZCs7OLREYuBpNmuwAY2NLrJma52zlZnXy0/Ph6OVI2UnIS/xc/eCh8OC0J42ysyI+s/PovaNo4dMCSqeqj0fnnYQtb7Z8E89znmPfzX18lyJafGen3r1/+eWXUCqV+O6776BQKMAwDL788kuLFmVJ2dlxrKwlqHZT41GmbUweYywaBsWNrIIsONs7o7F3Y5x74xwO3jmI0btGW8XkJxJGwlrvFMNIoFKNQFhYDMLDnyIsLAYq1QibOzEFTM9ztnKzWrkAbHxpZspOokvH2h1x4sEJTo9J2fkPPrNzb/xe9AvsZ9K2toKykx1SiRRfRX2Ffx/+NyudK7aKz+zUe4QaNWpg0KBBSE1NRXFxMYYPH44aNWpYvDBLKr+WoKn8XP2Q8KLyzId0zw/hSmZBJlzkLgAAlbMKv4/9HfnF+YjcGKl3YkehY7NhT/5hTp6zkZvV6RDWAcfPH6fsJKQKfDTsyT/4yk6NVoN9N/ehb8O+Ol9D552ETT0a9ICfqx/WXlzLdynEBAZNnjds2DDMnTsXz58/R+/evXHkyBEuarOo0rUEy9NqNUhK2oyYmDCcOaNCTEyYziFUalc1HmWIq8deLMO1iGFKe+xLKWQKbB28FeHqcLRf117UyzFSw94yzM1zc3OzOp4KT6Tmphq1DVcoOwnfImpH4OSDk9RQ4wlf2RnzOAbuDu4I8Apg7XvhEmWn+DAMg6+ivsKnJz9FRn4G3+UQI+lt2K9YsQLbtm2Dq6srlEolfvrpJyxbtoyL2iyu/FqCWq0GV68OQnz8JGRlxaKwMBlZWbE6h1D5uvriUcYj+iNLeJNVkAUn2UuTczASLIhcgN4BvfHG3jdE2ziWMBIUa/lfX93asJHn5uRmdTwVnrTSCCE61HavDYWdAjee8b+KhS3iKzv3xe9Dv4Y0DJ9wq0XNFuhStwu++fMbvkshRtLbsC8uLq4wQUijRo2s5ipb+bUEk5O3IC3tCDSa7Aqv0TWEytneGS5yFzzJeqJz/0IbBkXDtayLl8JL58oMCyIX4Hnuc7x/6H2Oq2JHUI0gxDyOKfuarV5hW8dGnpuTm9VROamQlJUEgLKTkKqE+4fjj0d/GLUNZSc7+MrO3+//jqj6UQYfQ2iZRNkpXjPDZ2LFhRU2e6+9WLNTb8NeoVDg8ePHZQEWExMDuVxu8cIs7eW1BBMSllQK2FJVDaECShofdPWc8CXEJ0TnWu9yOzn2DNuDg3cOYvHZxSYfg6/hcv2D+uPA7QP/W9ucvV5hW2dunrORm7qUjoIixBpYIjtb1WqFC48vGPx6yk728JGd+UX5uPT0Etr4tjGveEJM0FTVFPU96mNv/F5OjyuE2zTEnJ06G/axsSVrSE+fPh3jx4/Hw4cPMXToUEydOhXvvy/OXsBSVa0lmJ9feSK88soPoSoV5EUNe8Kf6hr2QMnQ5gMjD2Dp+aXYfGUzh5WZT+mkRHOf5jhy9wirvcK2io08Zys3dfF18UViZuUlRAkhJUJrhlab+S+j7DQfn9l56eklNPRqWDZJLiFcm9JqClbGrOS7DM6JOTvtdD3x+eefY9euXQgNDcW2bdtw6dIlaDQaNG/eHJ6enlzWyConp6YIDHwfSuWwCssOyOVqFBZWPay55Hm/So8F1ggUbcOehkCJX4hPCJb8saTa16jd1Pht5G/o8mMXKJ2URg3p49ugoEHYeX0nfHyv6O3ZUKlGcFyduJib52zmpi5+rn6iaNhTdhK+NFU2RVxyHDRaDSQGLJtkSK8wZWf1+MzO849j0apWK1a+DyGg7BSfQY0GIfpgNK6nXEcj70Z8l8MZMWenzr8M5X8BXV1d0bFjR3Tu3FnUjXoAaNp0b5VrCarV0ZBInKrc5uUhVKVoKD7hU4hPCC4/vaz3j2WwMhjbh2zHiJ0jcPHJRb37FcostgMbDcS+m/uQnfuw2tcZ0ytsq8zNczZzUxcaik/EztLZ6aHwgKfCE3fT7hr0ejZH1NgqPrMz9kksWtZsaXrxhJjJXmqPCS0mYFXMKoseRyjnnaXEnJ06e+xTU1Pxww8/6Nxw3LhxJh903759WLVqFYqKijB27FiMHDmywvNHjhzB8uXLodVq4efnh/nz58PNzQ27du3C4sWL4eXlBQDo1KkToqOjTa6jPKVyOJKTf6k09KKqIVSlGns3RlxyHLRaLe/3gxDbU9O5JqQSKe6m3UV9z/rVvjaidgS+7f0tBm4diKtvXRXF0D5/N38EeAbgcMpjRFZzDmVMr7CtslSem5KbuqicVEjLTUN+UT7kduKfx4UQS2iqbIq4pDg08Gyg97VsjqixVXxm519PF2Fy2GST9k8IW95s+Saaf9scC6MWwsHOge9yOCHm7NTZsM/Pz8fNmzdZP2BSUhKWLFmCnTt3wt7eHsOGDUObNm3QoEHJH6msrCzMmTMHO3bsgEqlwtdff43ly5fjo48+wtWrVzFz5kz06dOH9boYRoLg4J1ITv65ZNKS/EeQy/2gVr9XaQhVqdputSFhJLiTdsegP7KEsIlhGAxuNBgbLm/A3M5z9b7+1cavYv+t/fjg6Af4ppfuJUzK91CUXrDiawjd2n5r0eH7tqjfVIG6jrmVnje2V9hWWSrPTclNXaQSKfzd/HEv/R6CagSxXishlsZFdgbVCMLN54b9LqvV0YiPn1TlkFLKTsPwlZ0Ag1uptxDoFcj6sQkxhtpNjRCfEOy/tR+DGg2yyDGEdN4JiDs7dTbsa9Wqhfnz57N+wLNnz6Jt27Zwd3cHAHTv3h0HDhzA22+/DQAoLCzE7NmzoVKpAACBgYHYt28fACAuLg7379/Hd999h8DAQHz88cdwc3NjrTaGkUClGmHwfRMMwyCidgRO3D9BDXvCi8lhkxG1MQofRXwEmVSm9/WLui1C8KpgDG0yFB1qd+CgQvM09m6MuZ2/wHcxc/FlEwZabU7Zc6b0CtsqS+U5YHxuVqe+Z33cSb1DDXtCdGjo1RDnH5036LVsjqixVXxl59Osp1DYKeDmwN45LiGmGh48HFuubrFYw15oxJydBt1jz6bk5GR4e3uXfa1UKpGUlFT2tYeHB6KiSib4ysvLw+rVqxEZGQkA8Pb2xpQpU7B3717UrFkTn376qUVqNEbH2h1x4sEJvssAIIwlIgi3miiboKFXQ+y+sdug13soPPBNz28wYd8E5BXlWbg6dkwOm4wMrTcSFFPg7NwSMpkKzs4tERi4Gk2a7DCqV9hWiWXSovoe9XEn7Q7nx6XsJGLR0KshbqYa1oNc2iscGLiastNEfGXnree3RNFhRNlpG15t/CoO3TmEjPwMvkvhhJizU2eP/euvv26RA2o0mgohoOv+9MzMTEydOhVBQUEYOHAgAGDFihVlz0+YMKHsAgCfOtXphM9OfoZiTTGkEinf5RAbVLocyWtNXjPo9QMbDcTmuM349MSn+KLrF9W+VggNQjuJHRZ1W4Tph6bjyuQrBo1MIBVZKs/ZVt+jpMeeELGzVHY29Gpo8FB8gN0RNbaIr+y8nXpbFA17Yhs8FZ6IqB2BPTf2YHTz0RY9lhDOOwHxZqfOSw4DBgywyAF9fHyQkpJS9nVKSgqUSmWF1yQnJ2PEiBEIDAzEvHnzAJQ09NevX1/2Gq1WC6mU/4Z0UI0g+Ln64b+3/svqfukqKDHUgKABuPHsBv5O+dvgbb7p9Q3WXlyL2MexFqyMPT0b9ITaVY01F9fwXYooWSrP2dbAs4HZPfaUncSa1XSuieyCbKTnpfNdik3gKztvp95GgGcAp8ek7CTVKR2OT4SN87EE7du3x7lz55Camorc3FwcOnQIERERZc8XFxdj8uTJ6NmzJ2bNmlUWMo6Ojli7di0uX74MANi0aZMgeuwB4M3QN7H+r/W8HFtoS0QQ7tlL7TE8eDh2Xt9p8DY+zj5Y0WsFBm4diMeZjy1YHTsYhsGE0Ak4eu8o36UQC2ro1RDxz+M5ORZlJxEjhmFQz6Me7qff57sUYkEPMx7C382f7zKqRNlpm/o27ItTD08hqyCL71JINThv2KtUKkRHR2PMmDEYMGAA+vTpg2bNmmHixImIi4vDsWPH8Pfff+PgwYPo378/+vfvj1mzZkEqlWLp0qWYM2cOevbsiWvXrmHGjBm5lwgWAAAgAElEQVRcl1+lVxu/iqP3jtIVdMKbqHpROHz3sFHbvNbkNbwV9hZ6/9QbmfmZFqqMPe4O7jZzf5etauDZAI8yHiG3sPIKCISQEv5u/nj44iHfZRALepr1FDVdavJdBiFlXOQuaO3bGsfuHeO7FFINnffYl3fixAmcOnUKUqkUnTt3Rtu2bc06aN++fdG3b98Kj61ZUzLEtmnTprhx40aV24WFhWHXrl1mHdsS3B3c0bVuV+y8vhPjW4w3eT9VXel8eT6ClwltiQjCj4jaERiyfQgy8zONWqN+5iszcTP1JqIPRmNtv7UWrNB8rnJXatizgO08Z5NMKkN9j/q4+fwmmvs0N3g7yk5iS6hhzw8us/Np1lP4OPtYbP+lKDuJMXo26Infbv2GfoH9+C6F6KC3x3758uVYsGABXFxc4ODggNmzZ2PDhg1c1CYqI5qOwE9xP/FdBrFRTvZOaFWrldErNDAMg697fI0Dtw/g5IOTFqqOHW5yN2rYm0kMed7YuzGupVzjuwxCBIsa9tzjOju5atgTYoyeDXrit9u/0YUcAdPbY793717s3LkTLi4lvYDjx4/HsGHDMGbMGIsXJya9A3rjzX1v4knmE5OHT1nLVVAx1y5mUfWicPjOYfRp2Meo7VzlrljWcxne3PcmLk++DLmd3EIVmsdV7ooXeS/4LkPUxJDnzVTNcCXpCkY0NXwmWspOYkv83fzx19O/+C7DpnCZnYXFhUjPS4eXwov1fb+MspMYo7F3Y+QX5+Ne+j3U86jHdzmkCnp77N3d3eHk5FT2taurKxwdHS1alBgpZAr0Dexr1ARmbNNqtRRqNiyqfhSO3Dti0rYDgwYiqEYQvjhV/fJ3fHKRuyCzQPhzAQiZGPI8xCcEF59c5PSYlJ1ETNSuauqx5xiX2ZmSkwIvhZcollCm7LQtDMOgc53OOHHfuNGhhDt6G/YtW7bElClT8Pvvv+PkyZOYMWMGatWqhUOHDuHQoUNc1CgakXUjjR4KTQhbWvi0wKOMR3iW88zobRmGwcreK7EqZpVRPUFczoJrJ7FDsaaYk2NZKzHkeatarXDh8QVotBq+SyHEIszNTR9nHyRnJ7NYEdGHy+zMyM+Am4Mbq/skhC1tfNvgwuMLvBybVl7QT+9Q/GvXSu51/P777ys8vnHjRjAMg27dulmmMhF6xf8V/N+R/4NWqzX7gye2K6CmTMBC2CWVSNHOrx1OPzyNAUHGr71by6UWvor6Cq/vfh1/TvwT9lJ7C1RpOgkjocaemcSQ5ypnFdzkbrj1/BYCawQavb3YsoaykxhL6aREUnYS32XYFC6zMzM/Ey72hk+CyxaxZQ1lJz/CaoVhc9xmvssgOuht2G/cuJGLOqxCHfc6YBgGd9Puor5nfb7LITaog38HnHpwyqSGPQCMaT4G2/7ehvmn5mN2p9ksV2ceatibTyx53savDc4nnjepYU+ItXOVu6KguAA5hTlwlAnrVhprxWV2ZhYYt7oNIVwK8QnB1eSrKCguEFwHEKmmYT9v3jzMmjULkydPrvL5b7/91mJFiRXDMOjg3wGnH562uYa9tUzAInYdanfA+4feN3l7hmGwus9qtPiuBQYEDahyyTG+rpJTw950YsvzNr5tcP7ReYxpLpxJ/SyFstM2sJmbDMNA6aRESnYKarvXZqU+UjU+sjOrIAvO9s6s79faUHbyw8neCfU96+Nq8lWE1gy1+PFoZIZxdDbs27VrBwDo3r07Z8VYg1f8X8Hph6cxNmQs36UQG9TatzWupVwzej378nxdfbEwaiFe3/M6/pzwJ2RSGctVmoYa9qYTW5638W1Dy4cSUg2VkwrJ2cnUsLcwPrKTr6H4hBgqrFYYYh7HcNKwJ8bR2bDv0qULAGDgwIEoLi5GVlYWXRUxQFu/tlgdu5rvMoiNcrBzQFu/tjh676jJw/EBYGzzsfjx8o/YdGUTxrUYV+E5vq6SM2CgBWWQKcSW56E1Q3H92XVkF2TDyd5J/waECBzbuenl6GXSRKnEOHxkZ25RLhR2CosegxBzhKhCOFtyk0ZmGEfvPfY//fQTFixYgMLCQgAomxju+vXrFi9OjIKVwbiVegt5RXlwsHPguxxe0C8cvwY3Goztf283q2HPMAzmdJyDCfsmYEzzMYJYdoca9eYTS54rZAqE+ITgj0d/oGu9rnyXwxnKTmIoN7kbXuS/4LsMm8FldhZrigXxN1dMKDu51ci7Efbe3Mt3GaQKehv269atw9atW9GoUSMu6hE9BzsHNPBsgL9T/qYhKoQXAxsNxIfHPkRuYS4UMtOv+kfUjoCPsw+2XduG4U2Hs1ihabRaLRjQMifmEFOeR/hH4OSDkzbVsCfEUG5yN7zIo4Y9V7jMzmJtMaQMNeyJcAXVCMKNZzf4LoNUQe869m5ubqI4CRSSEJ8QXHpyie8yiI3ycfZBe3V7bL221az9MAyDjzp8hHmn5um8t12r1XJ6pVxI65dqtRokJW1GXFw/vksxmJjyPKJ2BE49PMV3GYSwjo3cdHMQZ4+9GHMT4DY7qceeCJ2fqx/S89KRkZ/B6XG5PucUEkOzU2fDPj09Henp6QgJCcH69evx7NmzssfS09NZL9iatPBpwdm9J4RU5a2wt7AqZpXZ++lWvxsUMgV239jNQlXmEdJQfK1Wg6tXByE+fhKys+P4LkcvMeZ5e3V7/Jn4JwqKC/guhRDBEWOPvdhyE+AnO6nHngidhJEg0CsQ8c/i+S7FJhiTnTqH4rdt2xYMw5RdGVmwYEHZc0K8J1NIQnxCsOP6Dr7LIDasZ4OeeHv/27j89HKVS9YZqrTXfs6JORgYNJDXHnMhDcVPTt6CtLQj0GiyYcAdTbwTY567ObihoVdDXEi8gHD/cL7LIURQ3BzckPQ8ie8yjCK23AT4yU6NVgMJo3dALSG8CqwRiBvPbqCVbyu+S7F6xmSnzmdv3Pjn3onSSUKKi4uh0Wggkwlj+SuhCqsVhstPL6OguAD2Unu+yyE2SCqR4tVGr2JP/B6zGvYA0C+wH+aemItdN3ZhUKNBLFVoPC20rJ7saLUaJCdvQULCEuTnJ0AuV0OtjoZSORyMnuMkJCz5X8CKg1jzvEvdLjh27xg17Al5iaPMEXlFeZwf15ZyE+AnO2USGYo0RRbZNyFsqeNWBw9ePOC7DNHgKjv1niWfP38e/fv3BwDcvXsXnTp1wqVLdP94dVzlrmjg2cBi99lffHIRKdkpFtk3sR59GvbBrzd/NXs/DMPgs86f4ZPfP0GxppiFykxTrClmrWFfflhTVlYsCguTkZUVi/j4Sbh27VVodcwpUCo/P4GVOrgmtjyPrBeJI/eO8F0GIYIjl8o5b9jbam4C3GanvdSebkEigufv5o+EF+L9neYSl9mp9yz5yy+/xPz58wEAAQEBWL16ddnXRLf26vY4m3CW1X1eS76Gvlv6oufmngj/Ppx+oUi1XvF/BbdSbyEpy/zhmr0CesFF7oJt17axUJlpNFoNaxMKVRzWVO4Ymmykph5GcvLP1W4vl6tZqYNrYsvzDv4dEPs4FlkFWXyXQoigONg5cN6wt9XcBLjNTnupPQo01LAnwqZ2U+NhxkO+yxAFLrNTb8O+sLAQTZo0Kfu6SZMmKCigwNGnW/1u2Pb3NlZmb3yU8Qhv7HkDnX/sjC51uuDhtIeY1HISOq7viHtp91iollgjmVSGqHpR2H9rv9n7Ku21n318Nm9DBNm877C6YU0aTTYSEv5T7fZqdTQkEidWauGS2PLcyd4JYbXCcOoBzY5PSHkOdg7IL87n9Ji2mpsAt9lJPfZEDNSuaupgNBCX2an3LFmhUODkyZNlX587dw6Ojo4G7dyW9W3YF89znuPkg5P6X6xDflE+Pjz6IZp/2xzeTt64+c5NRLeLhtxOjuntp2N6u+no9GMn3Hx+k8XKiTXpHdAbv94yfzg+AHSt2xW1XGph4+WNrOzPWGw27PUNa8rPf1Tt80rlcHh4RIruJFWMed61blccuUvD8Qkpj48ee1vNTYDb7JTbyalhTwTP380fCRnUsDcEl9mpd1rSWbNmYerUqbCzK3mpRCLB8uXL9e7Y1kklUkS3jcbKmJXoWKejSfs4eu8o9sTvwV+T/oLarfIwjKmtp0IhUyD8+3As6b4Eo5qNMrdsYmW6N+iOdw+8y0qjmGEYzOk0B5N/nYzXQ17nfIb8Yi1799jL5WoUFiZX87xftdszjATBwTuRnPwzsrMXARDHhFBizPOo+lGYsHcCFmMx36UQIhgyqYzzxp+t5ibAbXY62DkgpzDHIvsmhC3uDu4oKC5AdkE2nOzFd7GOS1xmp96GffPmzXH8+HHcvHkTUqkUdevWhb29bc70buyMhq81eQ0zj85EVkEWnO2djT6evdQePs4+VTbqS41vMR6hNUMxYscI/Hb7N6zvvx4yqXBnuSbc8nH2QQ3HGriech1NlE30b6BHx9odUaQpQuyTWITVCmOhQsMVa4phJ2FniSS1Ohrx8ZOqHBolkThBrX5P7z4YRgKVagSaNo0A0JWVuiyNrzw3ZzbYVrVa4WnWUzx88RD+bv4Wr5UQMWDAsHKrnzFsNTcBbrPTVe6KjPwMAOZlJyGWxDAMvBReeJ77nBr2enCZnXpTQaPR4IcffsD8+fMxZ84crF69GkVFtrcMhykzGtZwrIFwdTj2xe8z6ZhOMieDrtqG+IQg5s0YPMt5hs9Pfl7peYZheF1/nPCrnbodzj06x8q+GIbBqGajsOnKJlb2Z4wiTRFrDXtdw5okEid4ekZBqRzGynGEho88N3c2WKlEih4NeuC3W79ZtM6qUHYSoWIYBlpw27C31dwEuM3O0oa9udnJJ8pO2+Dl6IXnOc/5LkPwuMxOvQ37xYsX448//sDYsWMxbtw4XLp0CQsXLmStALEwdUbDYcHDsOXqFpOO6ShzNHg4lqPMEev7r8e3sd/iQuIFk473Mgpm69Dej90VGkY2HYmfr/7M+SR6bDbsS4c1BQauhrNzS8hkKjg7t0Rg4Go0abLDantC+Mhzc2eDBUpWZdh/2/xJILlC2UksjY8ee1vNTYDb7HSTuyEjP4OV7BQbyk5xKe2xJ9XjMjv1niWfOnUKO3bsgExWMry7U6dO6NevHz788EPWihADQ2Y0VKlGVHpuQNAAvPPbO0jLTYOHwsOoYxrTsAeAmi41sbzncozeNRqXJl2CQqYw6njEOrVTt8PX579mbX8BXgGo7V4bR+4eQY8GPVjbrz5sNuyBf4Y1VfV7a634yHNTs7O8bvW74a3/voX8onzI7eSWKJMQUeGjx77kuLaXmwC32ekqd8WLvBesZCchlkQ99objKjv1XiLQarVlQQYA9vb2Fb62FabOaOgqd0VkvUjsid9j9DGd7J3K7rMy1JAmQxBaMxSOgxwrXfks/ZquhtqG0vc6WBmMx5mPWQ3fUU1H4ae4n1jbnyGKNEWQMqavY6/VapCUtBkxMWE4c0aFmJgwJCVtFvRwRrbxkefmzgYLlNzW1EzVDIfvHmarLJ2qyknKTtsihveayx57yk5us7N0KH5eXvVrhBuSnVyi7LQ9L/fY03tdER/ZqbdhHxQUhC+++AIPHz5EQkIC5s+fj4YNG1qsIKGSy3VPYFfyvO4ZDbvW7YrTD08DMO5D7+PsAwC4n37fsCL/Z1XvVYAfgAijNgNAwWyN7CR2CPcPx/H7x1nbZ/cG3XHiwQnW9meIIk2RyRNDivleRTbxkefmZGd5p789jb4z+7JRkkVQdhIumZOHxqDsLMFldsqkMjjZO6FQWqva1xmanULPIMpO8XK2d0Z2gXhWt+ASX9mpt2E/e/ZsZGRkYNiwYRgyZAhSU1Px8ccfW6QYIVOro3WuH6hvRsPWvq3xZ+KfRh9TwkgQWS8Sh+8Y10vl5uCGxwsfo+6gulgds7rsca1WW/aP2Jaudbvi2L1jrO0vwDMA2QXZSMxIZG2f+hRqCk0eim+L9ypWhY88Nyc7K7gGIBAWXwaqqpyk7CRCU1BcAHup5Ve0oOwswXV2ejt6Q+45ip3s5Ahlp+1R2CmQW5TLdxmCxFd26j1L/u6777BgwQJWD7pv3z6sWrUKRUVFGDt2LEaOHFnh+evXr2PWrFnIzs5GWFgY5s6dCzs7Ozx+/BgzZszA8+fPUbduXSxatAhOTtwssaBUDkdy8i+V3iRDZjRspmqGO2l3TLqqFVUvCvtv7cfElhON2q6mS00cHHUQHdd3BIIA3DBsu/LhW3qllAJZPKq6us0wDOADYDCwovcK1o7TXt0e5x6dw+DGg1nZpz5FmiLIJKb1UNG9iiUskef6mJOdFWQDSAT+e/O/eK3Ja5Yp1gyUneKmMzv/R2jvJVcNe8rOElxnp9JJiWKH1vDwiDQ/OwWOslO8FDIFZs2dhdmdZld4XMjZyRW+slNvj/3x48dZPWBSUhKWLFmCn376Cbt378bWrVtx+/btCq+ZMWMGPvnkExw8eBBarRbbtm0DAMydOxcjRozAgQMHEBwcjJUrV7JaW3XMmdFQbidHzr0cOAc4l9ufYcOMoupF4ei9oyjWFBtdc4BXAPYO3wv0BeBi9OZGo2FTApYEwBGs9rC382vH6mz7+hQWm95jz8Z93taA7Tw3hDnZWSknrwJDPhtidVljbd8Psbz84nxOGvaUnSW4zk6lkxLPcp6zl506HhM7a/t+xMZR5gjY3rRrBuErO/WeJfv5+WH8+PEIDQ2t0Ds+btw4kw549uxZtG3bFu7u7gCA7t2748CBA3j77bcBAImJicjLy0NISAgAYNCgQVi2bBlee+01XLhwAStWrCh7fNSoUZgxY4ZJdZjCrBkNEwH4Aqh+LpRKfF19oXJS4dLTSwirFWb0YcNqheHjnh/jasurRm9LxKe6K9+v/fIajt47ijHNx7ByrPbq9ph5dCYr+zKEOfeUyuVqFBYmV/O8Yfcqih3beW4o1maDvQ6gOwA5gHwWCtPDVnsabJHYeg256rGn7CzBdXYqnZRIzk4W7SoEQv7dIexR2CkwccpErP6t5LZfMWQnV/jKTr099u7u7lCpVEhMTMTNmzfL/pkqOTkZ3t7eZV8rlUokJSXpfN7b2xtJSUlIS0uDs7Mz7OzsKjwuBlqtFhvmb8CQ94ZUeMzQ+456NOiBX2/+avLxZ3WYhRvPbmDj5Y1GbUf3RVmXyLqROHjnICv70mo1UNvdxqXH53HqtJKTmT7NmRWftfu8RY7tPLe0SjmZB/Rv3h/rzq0TdDZRdhJd2JolOa8oD3Kp5Zd+pOwswXV2qpxUeJr11OTtxXq/u9DrIxXJ7eTIL+bgKjvEtzoHX9mpt8d+/vz5uHDhAlq1aoX09HTExMQgMjLS5ANqNJpK916U/1rX8y+/Dqj6njihauPXBh//btpEK0OaDMG4PeMwu+Nsk75nuZ0cW17dgsiNkWinbocGng1MqqMqYrsv0ZYNCBqA/zvyf8gqyIKzvbP+DXQonekzLe0IHKVaJGenwKsoBfHxk5CSsl3vEEFTFWuLIZWY1rBn7T5vkWM7z/kwpvkYLDu/DONbjOe7FLNQdtqe8tlZmkOFhckmZWdmfiZc7C1/jx1lZwmus9PP1Q8xj2Mstn8xo+wUFgaWb4uxmZ1c4Ss79f4UlixZgmXLlgEA8vLysHr1arPubffx8UFKSkrZ1ykpKVAqlTqff/bsGZRKJTw9PZGZmYni4uIqtxO6Bp4N8CL/BWDCXH9tfNsgrygPl5Mum3z85j7N8UnEJxi+YzgKigtM3g8Rj5evfKucVQj3D8eu67vM2m/5mT5VDsDTvJLHLT3TZ7Gm2OQee3Pu87YmbOc5H3oH9Ma1lGu4l3aP71KIlbJUryGbsyRnFmTCVe7KdomVUHaW4Do7/Vz9kJBR/T26hAiNGLKTK3xlp969Hj16FN9//z2Akkb3pk2bsH//fpMP2L59e5w7dw6pqanIzc3FoUOHEBHxz4Lrvr6+kMvliI2NBQDs2bMHERERkMlkCAsLKzv27t27K2wndBJGgta+rbEndo/RH3qGYTCsyTD8fNW8D+7brd+Gj7MPPjr2kVn7KU+sw71s1ZhmY7DxinG3ZLys/EyfPg7A03KjsEpn+rQEc3rsgX/u8w4Li0F4+FOEhcVApRphMyemAPt5zqXSTJHbyTG0yVBsurKJ75LMQtlpewyZJdlQmfmZcJFzMCsuKDsB7rNT7abGowx2Jteytkyh7LQ9bGYnl/jITr17LiwshEz2z4RVMpnMrCHwKpUK0dHRGDNmDAYMGIA+ffqgWbNmmDhxIuLi4gAAixYtwvz589GjRw/k5ORgzJiSyb5mz56Nbdu2oVevXoiJicG0adNMroMPbXzb4Pyj8yZtOyy4pGFvTmgxDIMf+v+An+J+wqE7h0zeDxGvfoH9EPM4xqzZ8cvP9KmSA0l5Lz9vmZk+zemxJyXYznO+jGk+BhuubKCTOCIqbM6SnFnAzVB8UoLr7FS7qqnHnpD/odU5DKf3HvvQ0FBMnz4dgwcPBsMw2L17N5o3b27WQfv27Yu+fftWeGzNmjVl/x8UFITt27dX2s7X1xcbN5rX28inNr5tsOjcIpO2baZqBoVMgbMJZxHuH25yDTUca2DjwI0YuXMkYt6MQS2XWjpfq9VqkJy8BQkJS5CfnwC5XA21OhpK5XCbulJvTRQyBV5t9Co2x23Gv8P/bdI+ys/06eMA3M1++XnLzPRpbo89sUye86FVrVawk9iZnYeWQtlJqsLmLMkZ+Rmc9dgT7rPT3cEdRZoiZORncHLLhVBQdooLVxfXaXUOw+n9Lfn4449Ro0YNzJ8/HwsXLoSXlxdmzZrFRW1Wofwsjg5Px+Hy49M4E/+V0bM4MgyDyS0nY+n5pWbX1LluZ0wInYAp/52i8zWlE1XEx09CVlYsCguTkZUVi/j4Sbh27dUq66dhUOIwqNEgs1ZZKD/Tp0wCFJV7yy09SzIXk7RYMzHleXUz4DIMg/Eh47Hu0jq+y6yEspPowuYsyWl5afBUeLJVGtGD6+xkGAZ13OsYPZeI2GYOL4+yU3y4WnaTVucwnN4ee0dHR3zwwQdc1GJ1Xp7FUQrgVV9g1tEP8E3hWaMnT5gQOgHzTs1D/LN4BNYINKu2WR1mocnKJjh4+yC6N+he6XlDJqoQ27qqpETHOh0xZPsQk3sCys/0ma/Jhvx/H2EuZknWgv6Am0MseW7IDLhjmo9B0IogLO2xVFA9WpSdRBc2Z0l+lvMMNRxrWKJMUgU+srOBZwPcSbuD5j6GjQwQ48zh5VF2ik9uUS4UdgqLH4dW5zCczob9u+++i6+//rrSkPlS+/bts1hRQmHukKCqQmqwLzD2QjF+v3sA3t7GhZSTvROmtpqKr85+hbX91pr0PZWS28mxtMdS/OvAvxD3VlylK26GTFRBAStOjjJHtPVri9/v/Y7+Qf2N3r50ps/k5J+BJ/+GQpYGZ+dGUKvfg1I5zGInDgyYSlfmadieYbjOc0tkJ1D5BK9r3a74Ke4nTA6bzGr95qDsJLqUz86EhP8gP/8R5HI/k7LT3IY9ZadhuMzOl98T5wLgr4eOGBg0gNXcFCrKTvHJKcyBo8zR4sdhMzvNJfTs1NmwnzhxIoCS4Ue2iI0rn1WFlFwKTKgLrLydhzY1FxsdUm+3fhsBywMwp9Mc+Lmad09Jn4Z9sCpmFZadX4b3279f4TmaqMK6da/fHYfuHDKpYQ/8M9Onl+oW3LXFCAv7lOUKqzpmxWH4Yu+d4BKXeW6p7CxV/gRvYuhEzDw6E5NaThLMJICUnaQ6pdlpbgPFnIY9ZafhuMrOqt6TGlLg8sPtuHYtj9XcFCrKTvHJLcyFQmb5HnuAvew0hxiyU+fR/fz8kJ6ejoYNG1b5z9qxsWairpDqoiz5738f3Da6Li9HL4wLGYdFZ02bhO9lS7ovwYLTC/Ak80mFx+VydbXb0UQV4ta9fnccvHPQ7P3kFuVycrW2VPmh+GJc15QvXOa5JbPzn+dLTvCi6kchpzAHpx6eMr1gllF2EksrLC5EZn4m3B3cTdqestNwXGVnVe+JrwJIzCliPTeFirJTfLgaii8UYshOnT32bdu2rdADUn4ILMMwuH79umUr4xkbVz51zeIoYYBJ9YAlt/MxR6s1uqfp/fbvo8nKJpj5ykz4OPsYte3LGno1xJst38SkXydhz7A9ZbWo1dGIj59U5c+AJqoQv2BlMHIKc3An9Q7qe9Y3eT/Pcp6htlttFivTTcJIoCk3eY7Yeye4xGWeWzI7/3m+5ARPwkjwbpt3sfjcYkTUjjC9aBZRdhJLe5bzDF6OXpCY2DNE2Wk4rrKzqvdErQAe5rKfm0JF2Sk+WQVZqOdRj+8yOCOG7NT5V2HAgAHw9/fH66+/jn379uHGjRtl/6y9UQ+wc+WzulkcW3g4QiJ1R+yTWKNrq+lSE6OajcLis4uN3rYqczrNQXJ2Mv5z7j9ljymVw+HhEVmpfpqowjowDINu9bvh8N3DZu3nfOJ5tPJtxVJV1ZNJZCgsLiz7Wuy9E1ziMs8tnZ0vn+C9HvI6ziWcw41nN4wr1EIoO4mlJWYmwtfF1+TtKTsNx1V2VvWeqByAnCLgRSH7uSlElJ3iY2urc4ghO3U27BcsWIDdu3cjKCgI8+bNw9ChQ7F582ZkZGRwWR9v2BgSVF1IeXl1w8jmE7AlbotJ9f07/N9Yd2kdUrJTTNq+PHupPba9tg1fnf0KZx6eAfDPRBWBgavh7NwSMpkKzs4tERi4WhD3kBDzRdWLwqE7h0zePj0vHffS7qG5ipt10GVSGQo1/zTsadie4bjMc0tn58sneI4yR0xtNZW125PMRdlJLC0xIxG+rqY37Ck7DcdVdlb1nkgYoJ4TcCeL/dwUIspO8UnNTbWphr0YsrPa3xKFQoH+/fvjhx9+wNdff42srCyMGTMG06ZN46o+3rBx5VNfSI1oOvwaSBUAACAASURBVAJbr22tMLzYUH6ufhjaZCiW/LHE6G2r4u/mj3X91mH4juF4nvO8rH6VagTCwmIQHv4UYWExUKlGULhaich6kfj9/u8o0hSZtP35R+cRVisMMqmM5cqq9nKPvdh7J7jGVZ5zkZ0vZ9DU1lOx4/oOPM58zMr3YC7KTmJJ5vbYU3Yah4vs1PWeNHAG7mTbWyQ3hYiyU1ye5zyHl8KL7zI4I4bsNPg3JTU1FampqUhLS0NmZqYlaxIEtq58VhdSjb0bw8vRC6ceGDfxk1arQVLSZvRyPY0V5xfg6NkQJCVthtaECwTl9W7YG4MaDUL0wWiz9kPEQeWsQh33Ovgz8U+Ttj+bcBbh6nCWq9Lt5R57sfdO8MmSec5Fdr6shmMNjGo6CsvOL6t2n6XZGRMThjNnVIiJCWMlOwnh0qOMR2atikPZaTpLZaeu9yTAxR4JhSqL5KahKDeJLrbWYy+G7NQ5eR4APHnyBHv37sWePXsglUrRr18/bNu2DSqViqv6eMPVmonDg4djc9xmdKzT0aDXl19qwUWTjXAv4Mf4y5hQxM5SC/O6zEPTVU2x/9Z+9AroZfJ+iDh0q9cNB28fRHt1e6O3PZNwBtFtSy4ClU4u9PI682yyl9qjoLig7GshrWsqBlzlOV/vy/T209FydUt88MoHcHNwq/S8GJapIbbHlOxMzExEp9qdzDgmZacxuMhOXe9J1+CB+O3UVt7eE8pNUh0+G/ZcnHdWPqbws1Nnw3706NG4d+8eevXqhUWLFqFx48Zc1iUIXKyZ+HrI6wheGYwZ7WcgwCtA7+tfXmphlD/w1kXgVb9s4H9LLZhTr5O9E9b0XYNxe8bh6pSrcJW7mrwvInw9A3ri/UPvY27nuUZt9yjjES4+ucjpTORyqRz5RfkVHhPCuqZiwHWe8/G+1HGvg54NemLlhZX4oMMHlZ43ZJka+hwRMbiffh/+zfzN2gdlp2G4zM6q3pP8onzc2fsFcgpzOF1athTlJtElpzAHBcUFNtdOEHp26ry0cOHCBWRmZuKXX37BqFGjEBoaitDQULRo0QKhoaFc1mjVfJx9MKP9DEw/NN2gq04vL7VQSwF0VgKbH/6z1IK5utbrih4NeuDfh/9t9r6IsIWrw3E37S4SMxKN2m517GqMaDoCLnIXC1VWmUKmQG5RLmfHsya2kucfdvgQS88vRXZB5eVoDFmmhhAxuJt216xlSonh+M5OuZ0cTbybIPax8SsosYFyk+iSmJGIWi61jF6ym1iWzh77o0ePclmHTZvWdho2xW3Cd7HfYXLY5GpfW9VSC6P9gfExwGt+gEzGzlILX0V9heBVwTh27xi61O3Cyj6Fgo/hO0Ilk8rQu2FvrLm4BnM6zTFom4LiAqy5uAZPv3yKFSkrKjyna71fNjjYOSC3kBr2prCVPG/s3Rgd/Dvgu9jv8F67ipPYiGGZGiGj3GRPVSfChmZnXlEeUrJToHatfnZmwg4hZGcb3zb4M/FPdKjdgfNjU26az1qzMzHTvNU5TGFOdtoKnQ17X19u3yxbJreTY+eQnQj/PhzNVc3RTt1O92vlahQWJld4zEsO9KkJ/PgAmBPKzlILbg5u+Lb3t5iwdwLi3oqDk33Vs0AS8ZvfdT5arWmFjrU7onPdznpfv/P6TgTVCMLTlKccVPcPhZ0CeUV5nB7TWthSnn8U8RF6be6FKa2mwMHOoezxqrKzPCEsU0OIPvfT78PfzR9SiZTvUmyCELKzjV8b7I3fy8uxKTeJLokZ5q3OQSyD/7v8CQAgwCsA6/qtw2u/vIanWbobTLqWWhimBs48A7KdhrBWU++GvfGK/yuYdWwWa/skwuPn6ocNAzZg5M6RBi0XtuLCCkxtNRVarbbsX6mqHmMLDcUnhgjxCUHLWi2x9uLaCo+LYZkaYhvMyc47qXdQz6OepUskAtLat7XJq9eYi3KT6GLuspum4Pq8U4yoYS8gfQP7YnyL8Ri3Z5zOD6iupRbc5E6Y3Lgpvrz4O6s1Le2xFL/8/QuO3TvG6n65xjBM2b/qHrNVUfWjMKXVFAzaOgg5hTlVvqZYU4xFZxfhfvp99A/sz3GFJevYa7SaCmvZE1KVTzt9inmn5iEz/5/lqMSwTI3QUG4Kz+3U26jvQffX25IAzwBkFmTiSeYTzo9NuWkaW8jOhBcJZi27SSyDGvYC81HER7iffh/7bu6r8vnSpRYCA1fD2bklZDIVnJ1bIjBwNWb3Po/LSVdw6ckl1urxVHjixwE/YsyuMcjIz2Btv8aypjDkgyE/v1kdZqG+Z32M2jkKxZriCs/dTr2NTj92wp74Pfh97O+QSWWc1VX+tc72zsgurHoiH0JKtajZAt3rd8f80/PLHqsuO615ySbKTvMI7ed3/dl1rPx0paBqIpbFMAzaq9vj9MPTPBzbNnMTEN7vvtDcTa9+Ek8h/vyEWBPbrPc3UqTspfZY1mMZog9G67yfuHSphbCwGISHP0VYWAxUqhFwkCnwXtv3sODMAlZqKf0FiKwXiW71u2HO8Tms7JcPNHxHP4Zh8H2/75GWl4bph6YDADRaDb7+42u0XdsWrzZ6FSdeP4EGng0qbcvVz9HF3gVZBVkWPw4Rv3ld5uG72O9wP/1+2WO6spPNk1NrOnGg3LQ8Y3+Wf6f8Dei+5ZlYqQ7+HXDq4Slejs1FbpYch7JTTG6n3q7yfJAr1vSzZBM17AUoqn4UmqmaYfHZxUZvOylsEo7dO4abz2+yWtOXkV9i05VNiEuKY3W/RFjkdnLsGroLh+8exjv730HnHzvjl79/wbk3zmFa22mQ8Hx13tnemRr2xCC+rr74V+t/YeaRmXyXQggrtFotrqVcA1L4roRwLaJ2BG8Ne0JeVqQpwoP0BzTfhwBRw16g/tPtP1jyxxIkvKh+qZGXOds7Y2qrqVh4ZiGr9Xg7eeOzzp/hrf++BY1Ww+q+dbGFe5QsydSfn7uDO34b+RtOPDiBAYEDcOL1EwjwCuC9LsCwhr1Wq0FS0mbExIThzBkVYmLCkJS0GVqOPrdEON5v/z7OJJzB2YSzfJfCKcpO8wjx58cwDCQuEqQ+TwWyLVMTZadwhdYMxe3U20jPS+e7FKsmxN99IUp4kQClk7LCyjOAMH9+XNQkpOykhr2ZLPVm1vWoi6mtpmLcnnFGr939Tut3sPP6TqMvCgDV/wJMbj0ZBcUF+PGvH6vcRixo+I5+/m7+uPLWFUS3ixbUskr6GvZarQZXrw5CfPwkZGXForAwGVlZsYiPn4Rr116lE1QB4eIPoZO9E77o8gWiD0Zb9IKkqScOYspOyk0B8IbFeuspO4XNXmqPVrVa4WzCWUE1IsxlSnaKKTcB68xOvofhC4nQspMa9maw9Jv5UcRHUDopMWjbIOQX5Ru8nZejF0Y0HYF1l9aZdfxKtMDqvqvxf0f+D/fS7rG776oOZwP3KFmSUH9+5tTlKnfFi7wXOp9PTt6CtLQj0GgqTrCn0WQjNfUwkpN/Nq94wgou/xCObDYSALDx8kbW9il0Qv3dFwsh/vy0Wi0WblqItwe/bZGaKDuFr1OdTjh275igGhHWRoi/+0J0/dl1BHoFVnpciD8/S9cktOykhr0ZLP1myqQybBi4AY4yRwzdPtSoZb7GhYzD+r/WG91Lpe8XIMQnBDNfmYkRO0fQsmNmENsVZ6Fwd3CvdihiQsKSSr+PpTSabCQk/MdSpREjcPmHUMJI8E3PbzDz6MxqLwqZQ4gnM9bKlrPzTMIZhPuHW2TflJ3C17VuVxy6tV1QjQhzUXZyh83svJp8FU1VTVnZl9gJLTupYW8GLt5MO4kdtry6BUWaIozeNbrSMmS6hNYMhavcFSfunzC7hpdNazsNfxz/A/bd7AV1Hw2xfh4OHtU27PPzq7/9JD//EdslERNw/YewlW8r9G3YVxArewjxHkQifFqtFmcTziJcbZmGPWWn8LX2bY276QlIyxdOI4IrlJvCEpcch6ZKatgDwstOatibgas3015qj+1DtiM1NxXj9443qBeeYRiMCxmHH/76gZUaypMwEmAXgBYA6rC++yrR1VvzWPLnZ84fVmPrcndwR1pems7n5XJ1tdvL5X4GH4tYDh9/CL/o+gU2x23G5aeXWd+3kFF2mkco2Xk79TbkdnKo3dQWqYmyU/hkUhmau9vhou4/gXQBhkWUnVXTaDW4lnwNwcrgal8nlOwszxaykxr2ZuDyzXSwc8DuYbtxP/0+pvx3ikEfzFHNRmFv/F5k5GeYdMzqfgG0WVrsn7Qf/u/6Aw4VX09BWDW64mw+fUPx1epoSCROVT4nkThBrX7PUqURI/Dxh7CGYw0siFyA8XvHo0hTxPr+S+nLQBp6ajzKzv8Nw7dQbz1A2SkWbZRKxFYzMb6YL8BUe85JuWkSS2Tng/QHcJW7wkPhwVaZoia07OS8Yf/48WOMHDkSPXr0wFtvvYXs7MpDipKTk/HGG2+gf//+GDhwIM6dOwcAKCwsRGhoKPr371/2r7jYsKHphjJmtlGu30xHmSN+Hf4rriRdQdcNXfUu4XTj2Q3YS+2x+685Fpk9tWdAT/QJ6AP0MHtXhBhEX4+9UjkcHh6RlX4vJRIneHpGQakcZukSbZaQs7PUuJBx8FJ44cvTX+p9rTXNPE3E78xDyzbsKTv5Y0zW9Aueitg0BlW1ZYVwAYZy0/pdSbpC99eXI7Ts5LxhP3fuXIwYMQIHDhxAcHAwVq5cWek1CxcuRJcuXbBnzx4sXrwY77//PoqLixEfH48WLVpgz549Zf+kUvaW4jJ2pmY+3kwXuQtOvH4CI5uOxPAdw9Frcy/EPo6t8JorSVfQ+6feGLVrFP7VyA/qvO8sNnvqwqiFQG0A7C1zbrWs6YozXz1oNRxr4HnO82rqkiA4eCcCA1fD2bklZDIVnJ1bIjBwNZo02QGGoUFKliCG7ARKPqNr+63F0vNL8dfTv1j7fohlUXYCR+8dRZe6XSxYF2UnH4zNmojAGdAycjzKU1R4XAgXYCg3hccS2Xnh8QW0qtWKrRINJtSRW0LLTk6PVlhYiAsXLqB79+4AgEGDBuHAgQOVXhcVFYU+ffoAAGrXro38/Hzk5OQgLi4OqampGDRoEIYMGYI///yT1fqMnamZrzdTJpXhjdA3cPPtm+gd0Bv9fu6HgVsH4tCdQxi1cxS6beyG/cv2o8H+h4hwvQlGm2PQ92MKJ3snHPnXEfi95Wf0jNN8/zIS8anhWAPPcp5V+xqGkUClGoGwsBiEhz9FWFgMVKoRdGJqQWLJTgDwd/PH4m6LMXrX6ErLiJZmElez9pt6ckXZaVvupt1FblEuGns3tuhxKDu5Z2zWSCRS9Gs0GrclAwXRiCjFMAy6dZMKOjcByk42/Jn4J1r7tua7DEERUnZyesS0tDQ4OzvDzs4OAODt7Y2kpKRKr+vevTvc3NwAAOvWrUOjRo3g4uIChmHQtWtXbN26FXPmzEF0dDRSU1NZq8+UmZr5fDPldnJMbT0Vt9+5jQ7+HRB9MBoBngG49c4t4Dww5FVwMvN013pd0atBL8w4PIOV/RHh46sHzZCGPeGe2LJzdLPRCPAMwOzjs6t8XmjL1xDrYUp2Hrl7BJH1IqlBYoVMyZpBjQbh0KO7gmhElDd4MDfnnIQ/Gq2Gtx57axq5ZUl2ltrxb7/9hvnz51d4rHbt2pX+MFX3h2r9+vXYunUrNm3aBAAYNuyfIUaNGzdGs2bNcPHiRURGRrJSs9CWLDCUQqbAe+3ew3vtKt5b5e1d/XZsfj9fdfsKwSuDy05ASPUohExDDXthElt2MgyD7/p8h2bfNkPfhn0rrQ0utu/Hlthidh65ewS9A3rzXQaxAFOypmvdrhi1cxQevngIfzd/S5VmNC7POYnx2MjO+GfxcHdwh8pZxUJFxBIsdnmvZ8+eOHnyZIV/33//PTIzM8smvEtJSYFSqaxy+4ULF+KXX37B5s2bUbNmTQDA7t278fDhw7LXaLVayGQy1moW2pIFxnr5XpOUlOpfz+b34yp3xXd9vsPEfRORmZ9pcI26HiOkKm4ObsguzEZhcSHfpZByxJid3k7e+Lb3t3hl8Stg5BXz5+rV5Gq35eP7oey0TRqtBsfuHUPXel35LoVYgCnZKZPKMCBoAH659oulyjIIn+ecxqDsZM/JBycRUTuC7zJINTgdtyOTyRAWFob9+/cDKGmoR0RU/oCsX78e58+fx5YtW+Dj41P2eHx8PL7//nsAwN27d3H9+nW0bNmStfqEtmSBubZvB3Jzq37OEt9Pz4Ce6FKnC9757R1W90uEjcthUBJGAncHd6TmsncLDjGfWLOzf1B/4AGAnhUf5zo7iW0yJDsvJF6AylkFP1fhXRwj5jM1O4c2GYotV7dYsjSjUW5av6P3jqJT7U58l0HD76vB+Q05s2fPxrZt29CrVy/ExMRg2rRpAIAtW7bg66+/hlarxYoVK5CamorRo0eXLWuXlJSEqVOnIjU1FX369MG7776LL7/8Es7OzqzVJrQlC8ozZAmRl+81OXoU8PPrz+n3s6znMvzx6A9su7ZNx/dB98gQ83g4eOBFvnETNRLLEmp2GpKbmdsy0SiqEdbEril77NChYs6zUx/KTtu0J34P+gf257sMYiGmZmeXul3wJOsJ/k752yJ1ieWc0xCUnewo0hThyN0j6NGA1rgWMovdY6+Lr68vNm7cWOnx4cOHl/3/hQsXdG6/bNkyi9QF/DNTc3Lyz0hI+A/y8x9BLveDWv0elMphvE1MUrqESPnZRgsLkxEfPwkpKdt1zoSq1YLz78fJ3gnrB6zHgJ8HoHOdzvB20nPTFSFGcnNwQ3peOt9lkHKEmJ2G5qazvTN2Dd2FDj90AHwBJArz+yG2aW/8Xqztt5bvMoiFmJo1UokUI5uOxMbLGzE/cn6VrzGVmM45CXf+ePQH/N38UdOlJt+lkGpw3rAXutKZmlWqEXyXUsaQ5VB01cvH99PWry1GNRuFd357Bz8PZmd5E0JKuTu4U8NegISWncbkZmCNQKzpuwYDngwAVpe8TmjfD7E9d1Lv4FnOM1paysqZmjVjmo9Bz809Ma/rPEhYbDSL7ZyTcOPA7QPo2aCn/hcSXtHlMxEwZTkUvocYfdb5M1x6egk7r+/U+Rq+ayTiRA17Yghjc7N/UH981OcjdPymI4o0RVyUaDLKTtuwN/7/27vzuKjq/Y/jrxkYBwHFjU1Bc8W9XMot0XJDURHN3dTU1LK618rcKm3TsrJyyzLNbm6ZJi5plmZ63XIhDUyxcgMUBgLZBByY8/uDCz8RlAFm5/N8POahc+bM+X7mcHhzvmfO+Z4dDGgywKSdNuE4Wnq1pJZrLX658otJl2uP+5zGspc6bdGev/bQt7F07G2d/LWwA/Z466XKmsqsGbiGabunEZceZ+1yhAPx0Mqp+KJkZcnN+d3nU1lTmZd/fNlcZQlhtO1R2xkYMNDaZQgbNrb1WL46+5VJl2mP+5zCvOLS4/g76W86+XWydimiBNKxtwP2eCspgC51u/B026cZtXWUzX8DJuyHk8pJjriLEpUlN53UTmwYvIE9f+3hi3C5rllYT2xqLL/H/06vhr2sXYqwYWNaj2H7he0mPdhtr/ucwny2nd9GcJNgNE6mu8W4MA/p2NsBe72VFMC8bvNQq9TMOzDP2qUIB2FQDHJqqihRWXOzeuXq7By5kzn755j8FFchjLX53GYGNR2Ei7OLtUsRNszTzZM+jfqwIWKDyZZpz/ucwjy2nN/CE82esHYZwgiyd2wHbPVWUsZwUjuxYcgG/vP7f/j+4vfWLkc4AINiQKVSWbsMYePKk5tNajZh45CNDPt2GL/H/27uUoUoYmPkRka2HFnyjKLCe7rt03x++nOTnclmz/ucwvQSMhI4ff203ObOTkjH3g7k3w4lIOBz3N3bodF44+7ejoCAz+952xFb4uXmxcYhG5mwYwJXb161djnCziko8o29KFF5c7NHgx4s6buEfuv7ceXmFcsULQRwTneOmNQYHqv/mLVLEXbg8fqPk3Y7jVPXT5lkefa+zylMK+xCGEGNgqisqWztUoQR5HZ3dsLebyHyaN1HeanTS4Ru7MHydlUx6GPRav3x95+Ol9dI+UMhjGZQDKiA+Pj1REd/RHZ2tGxLoljlzc0RLUeQkJFA7697c2TCETzdPE1coXEUxYBOt1G29wri01Of8nTbp3FWm34XTbYlx6NWqZnUZhKrwlfxcJ2HTbJMe9/nzCfbe/l9+8e3TG432dplWJ29bEu2U4lwaIpioE+VI7gZrrDgzG/cvq0jPf00UVFTOHduCIpisHaJwk5k6m+hu7GCqKgppKefRq+XbUmYz/Mdnmd4i+H0WdfHKndjUBQDkZGDZXuvIJIzk9kQscEsO9KyLTmup9o8xbd/fEtyZrK1S7EZsr2XX1x6HCdiT1T4+9fb07YkHXthETrdRlJu7mdWQC4RKbD9et50gyGDpKSf0Ok2WbdAYTeikyPQ6s8Vuc+ubEvCXN587E0C6wXSd31f0rLTLNq2TreR5OR9sr1XECtOrmBgwEDqVK1j8mXLtuS4fNx9CAkIYemJpdYuxWbI9l5+639fT2izUNwqFT+YYkVhT9uSdOyFRURHf4TBkIGbM7zTEv5zFc7878svgyGD6OjF1i1Q2I0bqVfwcM4q9jXZloQ5qFQqPurzEa28WjFw00Bu6W9ZrO387CyObO+OJVOfydITS3mlyytmWb5sS45tbte5LD2xlJSsFGuXYhNkey8fRVFYe3Yt4x8cb+1SrM6etiXp2AuLyM6OLvh/ncowpym8+QfE/a9/du3aaRnpXBglMTubGpXu/Xp2dozlihEVhkql4tPgT/Gv6k/whmCLfXN/Z3YWR7LTcaw9s5ZH6jxCc8/mZll+SduSZKd9a1yzMX0b9WXJr0usXYpNkOwsn/Ab4WTczqBrva7WLsXq7Ck7pWMvLEKr9S/0vH0NGFUX5kZCZi7odKZtT6VSSWA7oOycbLJyocp9xpTSav0sV5CoUJzUTqwdtJbGNRrTe11vi1xzf3d23k2y0zHkGHL44NgHzOwy02xtlLQtSXbav1cDX2XJiSWkZqdauxSrk+wsn7Vn1jL+ofFyFyLsKzvlp+WAFMVAfPx6Tp1qz5Ej3pw61Z74+PVWHdzB3396kXuiDqkDTarAggtOfLvFSoWZgaOFuy3RZeioVbkazk7FX++lVrvh7/+ihasSjsKY7FSr1HzW/zM61OnAY189Rnx6vFlrKi47C2pRu7FFstMhbPljC77uvnSp28VsbZS0LUl22r8mNZvQp2Efi39rby/7nfkkO+8vLTuNDZEbGPfgOJMt057ZU3ZKx94CLBl4tjpyo5fXSKpX71noF0Olgmf8IDYxl5+1+dNUFXrnzlRs8Y+sKcSmxeJfrVGRbQnywrVGjV54eY2wUnXC1Gw1O/OvuR8UMIgua7pwKfmSyevJV1x2AmRmwsGDGfz88//XJNlZftbIzhxDDvN/mc/r3V43Wxtw721JstOxzOs2j4+Pf8z5qyttLjstSbKz7JafXE5QoyDqVatn1PyOus+Zz56yU+5jb2b5gXfnaIp6vY6oqCkkJGyhRYutJr3/oTEjN1rjvqQqlZqWLb9Dp9tEdPRisrNjiIiIZ8sWuHwEeAp4FDhcnjaKhvKd0xRFKfvC7YiltzlLik2NpU7VOrRsubXQtqTV+uHv/yJeXiPs9rOJwmw9O1UqFfO6z8Pb3ZuuX3Zl18hdtPFtY7J6/r+de2fnzz+DKWJNsjOPtbLz67Nf4+PuQ68GvUy+7DsVty1JdjqeRjUa0sOnCvP3P88zDXIA28pOS5HsLJuM2xl8dPwjDow7YNT8jrzPmc+eslM69mZm6cAzZuRGawQs5P1ieHuPKmi/SxeYOvV/r1VVwUT4atlXjH1wrFXqKw9bCndb/SNrCjGpMfhV8SuyLQnHYy/ZObX9VDxdPemzrg9fhnxJcJNgk9WU777Z+b+csccdSJDszM7J5o2Db7B+8HqLfGMo2en4dLqNjPCNZ/yJHEJrg49L3nRby05LkOwsvZWnVtKtXjejB/F05H3OO9lLdtrOIQYHZelbJNjTyI2FpAHrYcZPM9j7194yLUJRlILH/aY5Onu6LUdpxabFmuX+zsL22FN2Dmk+hO0jtvP0zqf58OiHdpc3kp15rJGdq8JX0cKrhVmvrRcVS3T0R1TXZBJSG9ZeKfyarWWnvXO07Lylv8UHxz7g1cBXjX6PI+9z2iPp2JuZpQPPnkZuLCIBtg7byphtYzh9/bS1qykVWwp3R/4jG5sWi19VG96GhcnYW3Z28u/E8UnH+fr3r5m4YyLZOdmmLM9hVeTsTMhI4K1Db7Hg8QUmXa6o2PK34+H+cCIJLqXf/bptZacoG3Nk56rTq+jo15HW3q2Nfo8j73PaI+nYm5mlA89eRm68e6CNkyfbERe3ji7+nfm8/+f029CP4zHHrV2mXXLkP7IxqTHUqSLf2FcE9piddT3qcnjCYW5m3aT7V92JTY01aY1w7+x0lEGKrMmS25yiKDy35znGtBrDgz4Pmmy5QuRvx27OebcV/vRS4evJbTE7LUGy8/7Sb6fz3pH3eC3wtVK9z5H3Oe2RdOzNzNKBZw8jN5Y0guqgpiGsGbiGgRsH8suVX8rYhn2eBmUK9vJHtizyB88Tjs9es9O9kjtbhm1hQJMBPLzqYQ5eOWiyGi0x+rRkp2W2uQ0RG4jURfL242+bbJlCQOHteFBtuKmHH/53V05bzk5zkuws2QdHP+Cx+o/R1rdtqd7nyPuc9kg69mZm6cDLH7kxIOBz3N3bodF44+7ejoCAz21mZEpjBtoIbhLMpic2MfTbofzw1w9WqrRsrB3u9vBHtiwURcm7xl6+sa8Q7Dk71So1c7rOYe2gtYzYOoLXD7xOjiGn3DUak532rKJk57WUBfvswgAAIABJREFUa0zfO511oeuorKlskmUKke/O7dhZDbMC4LNLkHi7ss1np7lIdt7f9bTrLD2xlHcef6fU73XUfU57JaPim5k1bpFg6yM3GjuC6uP1H2fHiB0M+mYQK4NXEtos1MKV2id7ui1HaSRnJaN10uJWqfgjw8KxOEJ29m7Ym9+m/Ma4sHF0W9uN9YPX80C1B8q8PFsefdoRWGKbMygGxoeNZ3rH6Wa5PaIQd2/HTTUxjKrvxLLoGvzcc4tdZKepSXbe3+sHXmdSm0ll+vvkqPuc9ko69hZg64FnaaUZaKOTfyd+GP0D/Tb045b+FqNbjzZ3eQ7BEbc5OQ2/4nGE7djH3Yc9o/fw0bGPeGTVIyztu5ThLYeXaVkySJH5mXub+/j4x9zOvc0rXV4xy/KFgKLbcYdOOXRa3YlV4V8wpf0UK1dneZKd9xYRH8HOizuJei6qzMtwhL/VjkIOowiLK+1AG21827B/7H5m7pvJ0l+X2vU1TKLsrqZcldPwhV1Sq9S81Pkl9ozew2sHXuOp7U+RkpVS6uXIIEX27ff431l4eCH/Cf0PTmona5cjKhBntTNfDfqKuT/P5VLyJWuXY3GSncXLNeTyzPfPMK/bPKq5VLN2OcIEpGMvLK4sA20092zOoacO8Xn450zYMYGsnCxzlylszPKTyxkYMNDaZQhRZu1qtyN8SjhaJy3NVzRn87nNpTpQKYMU2a+UrBSe2PwEH/X5iAbVG1i7HFEBNfdszquBrzJy60j0uXprl2NRkp3Fe/fwu2icNExpV/HO4nBU0rEXFlfWgTYaVG/AsYnHuKW/Rdcvu3It5ZolyhU24JcrvxCVGMXkdpOtXYoQ5eJeyZ2V/Vey+YnNvHXoLfpt6Gf0N2gySJF9ysrJYvDmwfRu2JsxrcdYuxxRgf2rw7/wdPXk1Z9ftXYpFiXZWdTxmOMsObGEr0O/ljOIHIjFO/bXr19n9OjRBAUF8cwzz5CRUXQwi9jYWNq0aUNISAghISFMnDgRyBv18b333iMoKIh+/fpx+vRpS5cvTKA8I6i6V3Jn05BNDGs+jA5fdODA5QMWrFxYg6IozNw3k7cee4tKTpWsXY4QJtGlbhfCJ4fTvV53Hln1CAv+u4Dbubfv+x57GH1aFJZjyGHElhHUcq3FJ0GfWLscUcGpVCq+DPmS9RHr7e6OQ+Uh2VlYSlYKo7aOYmXwSvyqVszLEByVxQfPe+ONNxg1ahTBwcEsX76cFStWMGPGjELzREZGMmDAAN58881C0/fu3cvff//N7t27uXr1KlOmTGH37t04O8sYgPamPANtqFQqZnSZQRvfNozcOpKZXWby747/RqVSmbjGvOXJNf3WFXYhjKycLEa2GmntUoQwKY2ThpmPzmRYi2E8t+c51n+2nk+CPqFng573fI89DFIk2ZnHoBiYsH0C2bnZbB66Wb4VEzbB082TDUM2MPTboRwaf4iAWgHWLskibD07LZmb03ZPo3fD3nK3KQdk0R6xXq/n5MmTLF++HIDBgwczZsyYIh37iIgILl68SEhICB4eHsydO5eAgAAOHjxIv379UKvV1K9fH19fX3777TcefvjhMtdkMBiIiYkp9swBR+fm5oafnx9qtX0eqezZoCfHJx0n9JtQTt04xef9P5dboZWBLe+Ex6fHM33vdD7r/xkqID5+PdHRH5GdHY1W64+//3S8vEZWuKPttqCiZqdGo8HLy4uqVauabJn1q9dn18hdhF0IY8quKbTwbMEHvT+gSc0mJmtDmN79slNRFP79w7+5fPMye8fsterZRopiQKfbKNlpI2whOz3xZFevXUT/HY0+Xm+Rg072vs/pKNb9vo7wG+GcmnzKajXY8n7nnewxOy3asU9OTsbd3b3gG3ZPT0/i4+OLzKfVahk4cCAjRozgv//9L9OmTWP37t3odDq8vLwK5vP09CQuLq5cNSUmJqJSqQgICKhQYWMwGIiNjSUxMbHQOrU3D1R7gCMTjvDs98/S5rM2fDHwCwLrBVq7LGECiqIwLmwcY1qPoXfDXkRGDiY5eV/BvWj1eh1RUVNISNhSIU+ls7aKmJ2KopCZmUlsbCyASTv3KpWK0Gah9GvcjyW/LqHz6s4MbzGc17q9ho+7j8naEeanKAozfprB4WuHOTDuAK4aVyvWYpDstDG2lJ0xqTGk306ncY3GZu3cO8o+p707pzvH9L3T2ffkPqvmkj2w1+w0W0V79uwhMDCw0OOll14qcrp0cadPP//884waNQq1Wk23bt1wdXXl0qVLGAyGQvMrilLuULx58ybe3t5WD1dLU6vVeHt7k5JS+lsu2RpXjStrB63lvZ7vMXLrSKZ9P43U7NQyLUulUhU87jfNXlirblO0+825b7iedp153eah020sFK75DIYMkpJ+QqfbVK62ROlVxOxUqVS4urpSp04ddDqdWdrQOmuZ0WUGF567gIuzCy1WtGDO/jkk3ko0S3umItmZJ9eQy3O7n+PQ1UPsH7sfDxcPi7R7L5KdtseWsrNOlTponbRcSr6EQTGYrR1H2uc0JUvmZuKtREI2hfBh7w950OdBky47nzXzXrIzj9lSpW/fvhw6dKjQY82aNaSlpZGbmwtAQkJCsUfuvv76a5KTkwueK4qCs7MzPj4+hXamTHHkLzc3F41GU65l2CuNRkNOTo61yzCZ0GahRD4TSXZuNq0+bcWeP/dYuySbZes74TezbvLi3hf5rP9naJw0REd/VCRc8xkMGURHL7ZwhaIiZ2flypXR6817u6harrX4sM+H/DblN5IykwhYFsCMH2cQl16+s9RE+dw3O11V9N/Yn/OJ59k3dh/VK1e3YqV5JDttjy1lp0qlol61egBcuXnFrKdGO9o+pz1JzU4laF0Qw1oMY+yDY61Sg63vd97NXrPToocLNRoN7du3Z/fu3QCEhYURGFj0tOmTJ0+yZcsWAE6cOIHBYKBBgwYEBgayc+dOcnNzuXr1KleuXKFVq1blrssWNyhLcMTPXb1ydb4Y+AVrBq5h2u5pPLntyVJ906UoSsHjftOEec3ZP4eBAQPp5N8JgOzs6PvOn50dY4myxF0cMUOMYcnPXdejLiv7r+Ts1LNk52bTfHlzXtjzAjGptrXNV/js9AGehua1mvPjkz9SVWu6yzTKQ7LTNtlSdqpVahpWb8jt3NtcS7lmtt9XW/rMtsISuZmpz2TAxgE8XPth3nn8HZMssyKw1+y0+HlA8+bNY/PmzfTr149Tp07x73//G4CNGzfyySd5t4KZO3cuR48epX///rz33nt8+OGHqNVqgoKCaNy4MQMHDuTZZ5/lnXfewcXFxdIfQdiBHg16EPFMBJ6unrT6tBWbz22uGDuXGHdU1Bx/TEx1NPbXmF8JuxDGwh4LC6Zptf73fY9WK7drEY7Nr6ofS/ou4Y9pf6B10tL609ZM3D6RSF2ktUtzGGXNzq/Pfk2tF2ux8emNfNjnQ5zVpRu+yJzfZEl2CmOo1Woa1WhEhj6D6NToCrO/5Oj0uXqGfjsUv6p+LA9ebpaDK8bmly3vdxbHXrPT4veJq1OnDl9//XWR6SNH/v+trLy9vfnyyy+LzKNSqZg5cyYzZ840a43GsvVRHePj4xkyZAiHDx+2dilW4VbJjcV9FjOsxTAm7pjI+oj1fNznY+pXr2/t0sQ93NLfYvKuybzfaxG3U3dz6lzeSKROTm6oVFoUJbvIe9RqN/z9X7RCtaIsbD03wbaz08fdh/d7v8/MR2ey8tRKen/dm5ZeLXmhwwv0bdRXbqlmSc5AL3jj4Bv8PPZnWnmX/wzC8rp7FGfJTsdh7ux0VjvTpGYT/kr6iys3r1CvWj3UpRwczJazs6LJMeQwNmwsapWatSFrS/2zrGgcJTvlp+ygDh48yNixY0lISLB2KVbX0a8j4ZPDebj2w7Rf1Z4ZP84gPr3o3RjuZounkBpzFNJap8SWt91MfSYhm0J40Ls1rfiWqKgppKefRq/XkZV1GUXJAQp3WtRqN2rU6IWX1whTfxxRQdlLdtZyrcWrga9y+V+XGdN6DG8deouGSxqy4L8LuJ523aq1VYTs3H9pP0wGqsDJp0+Wq1NvqszOH8VZslOUlbPamcY1GpNjyOHPf/4kx2D8NfH2kp22ypS5mZ2TzbBvh5GcmczmoZvROJV9TIeSstOal2FJdhYlHXsbMmPGDDZv3lzw/Mknn+Ts2bOF5pk4cSIhISGFHsePHy+yrC1btrB06VKz12wvtM5aXg18lchnIsnQZ9B0eVMm75zMhcQL1i6t3BRFISEjgeMxx9kQsYG3Dr7Fs98/y7uH34WmQK2807Hu935r74Tvu7SPtp+3xdfdl3c79ubmzf3FDFqSi0rljFZbH43GG3f3dgQEfG6ztxwRllORs1PrrGXsg2P5ddKvbB22lcvJl2m5oiVB64LYGLGRTH2mtUt0KH8l/cWgTYN4eufTbH1uK4ZNBqq5VLN2WcC9R3GW7BT3Ulx2RkZE0qhGI1w1rlxIvMD4p8Y7ZHY6qptZN+m/sT9qlZrtI7bj4mx7lyzbwn7nnRwpOy1+Kr69K+6o1d3XkJTVkCFDWLp0KcOGDSM2NpakpCQefLDwLSlWr15t1LIcMVzvPk1Gq/XH3386Xl4jjf4F863iy4rgFbzR/Q1WnFxBt7Xd6FCnAy93fpmudbve9bMsf3tlcb92811LucbWP7by3YXvOBt3Fme1Mw1rNKRB9QY0rN6Q5p7NuZZyDdoAtaDKwio8UO0B2tduz7gHx9GjQQ+bOC0rJjWGF/e+yMnrJ/kk6BMGNBnA6dMP33MkUkXJRqOpQfv2lyxcqSgPc+YmSHbma1e7HasGruKTvp8QdiGMtWfXMm33NPo98CCB1a7TzC2Zyi51zZ5jtpydZZWancrbh95mzW9reLnzy2x6YpPN7TDfbxRnyU77ZM3s9PfwR5uhZfrC6TSs3hB3rft9l2XP2Vkca+RYeduMSoxi4KaB9GnYh8V9Fhs93oc5s9MeOFJ2SsfehnTo0IHXXnuNmJgYtm/fTkhISJF5Jk6cSGJi4VHeZ8+eTceOHS1VplXknyZz5xE1vV5HVNQUEhK2lPromaebJ/O6z+OVLq/w1dmvmLRjEh4uHkzvOJ2hzYfirHYyaXvl/Zzh4WP46eQY6Aw0h3oL6sEF4A9I+j3pnrdVWtRrEZB3WtZfSX/x8+WfeWXfKyRlJvHUQ08x/qHxPFDtATN8jvvvbNzOvc1Hxz7i/aPvM+3haXw16Csqayrn1WqnI5EK65HsLMxV48qoVqMY2XIE+0/2ZUvUAd6N0JOmh66eCTx2fRLd6n9Lq5bfmTzHTJ3V5W03PHwMp06NQaUCRTG+U5T/WsbtDL488yUL/ruAoEZBRDwTgW8VX5PXb0xNJZHsFKVVUnZ6uXnx8rSXiUuIQ6PWFHQUHTU781kjx8rb5u4/dzM+bDwLeyxkYtuJ5W63LNlpzW/hJTvzSMe+lO7ccEw9kIlKpWLQoEF8//337Nmzp9hvmIz91snR3Os0GYMhg6Skn9DpNuHtParUy62sqczU9lN5uu3T7Lq4i49//ZhXfnqF8c270FHzE+5Ot0zaXknu/pzZuXAoEXbdgCtOULsVXN8HXAYMee8x5l7JWmctLbxa0MKrBc89Mo39fyxk1clPeOjomwR4uPPcw5MZ3f491GYeeEtRFMIuhDF7/2wa1WjEr5N+pWGNhoVr1fqj1+vu/VlsdCRScW/mzM38ZUp2FqXTbaRS1hFG+OsZ4Q/XbsEvCfDxxSzeOLeDQRf7MrrtLLrU7UIlp0oma9McWV3WditXhvbt4fHHYf9+45cXnx7PshPLWHl6JY/WfZSdI3fS1rcNOt1GTkVZ9kwEY0l2Oh5byM7/rP0P2TnZXEq+hLPamfrV6uPs5NjdB2vkWFnbVBSF94++zye/fkLYiDA6+3c2Sbtlzc7iWOssLmM5UnZaf22KQgYPHsymTZvw9fXF29vb2uXYjPudJmMwZBAdvbhcy3dSOxHSNIQD4w6wc+ROzsTsY8SxWyw4D4cSIPWOS9Tvbs8Ut9XId+3aYmIyMth+HV6LhCHH4Kd4GFIHtnaC1x4C/gYlt2wDk+Qfma30z0KeeSCBzR0VetVKY/6hxdT9sCoTd0xkY8RGowYXLI302+l8duozHlz5IG8cfIPFfRaza9SuIp16AH//6ajVbsUux5ZHIhXWJdlZ1N25WdcVxtaD1e1h8YMKmtuRzNw3E8/3PRm4cSBLf11KVGJUuToOpclqU2bn/dqtXBmeeCLv//cbWElRFI7HHGdc2DiaLm9Kwq0Ejkw4wrbh22jr26bI4Erp6aeJiprCuXNDUBSDST5HeUh2irIwJju1zloCagXg4uzCuYRz3My6aeEqLcvc+5zlbTM/O5Mykxj67VA2n9vM8YnHS92pL6ldY7PzfoobmE6y03wc+5CbHfL19cXX15fQ0FBrl2JTLHmaTBvfNsxu5sykunAgAXbegPeiwEsLrT2glQe0zb1KO0Up905pdk42v8X9xtHooxyNPsovf59BAdpVh0BPeLEJVL/jizQvr/J9truPzFZSQ09v6OGlcC1LIUajZ9O5TTzz/TP4VfWjjW8bWnq2zPu237OF0be/URSFm1k3uXzzMl+d+Yp1EesIrBfI4j6L6VG/x33Xm5fXSHS6b4scQbb1kUiFdUl2FnW/3KzrCg09cvm0ywkSMhLYf3k/P/79I4uOLkKFim4PdKOLfxcerfsozT2bGz0mh7VOaSyp3XtlZ64hl6PRR9l2YRthF8JwUjsxpd0UFvdeTE3XmgXzWetMhNKQ7BRlYWx2qlVq/D388XDx4OrNqyRnJuPv4W/0ddz2xBo5Vuo2W0HLFS0Z3mI46wavK/OYH2XNTmNJdlqW4/02WpCpryVRFAWdTkdiYiI9e/Y0yTKjoqJMshxrs/RpMlqtP9X0OkLrQGgdyFXgr3T4PSXv1PhPL91k/AkPGlRvAMOAZPjs1GfU9aiL1lmLs9oZjVqDxkmDRq3hlv4W0anRRKdE5/2bGs21lGucTzhP45qN6ezXmdCmoYzxicIjN5J79Xt1914FRrnXkVmVCupVzqSF+x/M7XmKHEMOZ+LOEBEfQaQukgMnDhCpiyQlO4UG1RvgqnGlsnNlKmsqF/ybqc/kRvoNrqddJy49Dq2TljpV6zAoYBC/TfmNuh51japRpVLTsuV36HSbiI5eTHZ2DFqtH/7+L+LlNcImTtsSZWeOa/AkO4tnbG56unkyouUIRrQcgaIoXPznIoevHeZw9GEWH1tMwq0EOvt3prNfZ9rVbkcbnzZ4u9/jmz0rndJYUrt3ZufNrJscvnaY7Re2s+PiDnzcfQhtGsq24dto7d262AOPxnybZu2dU8lOx2Yr2VlVW5Xmns2JTYvlnO4cvlV88XT1LPi9qUjZaY02L/5zEcYCrvDd8O/o6Fe+sQ5Kk51lIdlpWdKxtyF79+5l/vz5zJ8/n0qVTHO9o6Pw959OVNSUYsPBHKfJ3N2ekwoCquQ9htd14803M9h/JI2zNc5CdaA6TH1rKlQFnKBLYBdyDDnoDXr0uXoqayrjX9Uf/6r+1PWoSxf/LvhV9aOlV0uqaKsUtBsfz30/Z2jo50ydWvYANPaIsLPamfa129O+dvtCr9/Musnl5Mvc0t8iKyeLzJxMMvWZZOZk4uLsgq+7L7Wr1Ma3ii+uGtcy16lSqfH2HmX1sBf2QbKzeGXJTZVKRUCtAAJqBRQMwBSfHs+R6CMciz7GB0c/IPxGOJU1lWnr25a2Pm1p7d2aprWa0qhGoxLbnDXrNPv3q4q0ma+snZd7tasokKCvjKHFU0zdaaD1p625fPMyD9d+mODGwczuOjvvAG0J7GVwJclOURplzU4ntRN1PepSy7UW0SnRJGQk4F/Vn6ouVc1YreVYep/TmDZnzD7NLzkqeAS4CJyATis7Fcxj6uzMb9dS+53W5ijZKR17GxIUFERQUJC1y7BJlj5NpqT2fv45DBTg+v8edzm89rBZ2i3v5yzvUehqLtVo49umXDUIYWqSncUzVZ54u3szuNlgBjcbDOTtQF5NuUr4jXDCb4Tz9e9fcyHxAlduXsGvqh+1K7njWykbb20OXtq8y5h8KrtS37snP/+83SyftUatoWRe+Yrfrx/iakY2V2/lDRZ49RY4qw10bxBHF/9HmdBmAg/5PITGSVOq5TvS4EpC5CtvdrpqXGlSswk3s25yNeUqLhku+Ff1x0VjW7eCLC1rnJp9rzZVKlfOZLXkl2a/gg5YCaSav11b2e8UpSMde1Fmlhzl0tKnyZTUnsGgvmNe041Ua+7PaY2j0EKIwiyVnebKE5VKxQPVHuCBag8UdPYB9Ll6LiVf4nziH5y6spkLN/Zz+mYKCbedSMxWk5m7lwYfN6Sma02qu1Rnb9heyIS5L82lqrYqGrWGZSeWFdxWy0nthEExkJ2TXegMoVv6W+hu6YhLjyM+PZ649DiSs5LxdvOmQdVG+DrraFw1i351fejS5F+0fGBque/4IdkpRPFUKhXVK1fHw8UDXYaOC/9coJpLNXzcfEzawXfkfc7i2szKiua3tKp8eUUhV5XJ989/T7/G/f43r+x3iuJJx16UiTXu8Wnp02SsdVqOOdt1pAFChLBHls5OS+aYxklTcBr/oKZFB+LKuJ1BbFosSZlJJGcms3fRXqgMlZwqkZCRUHDpUv5lTLlKLmqVGhcnF7TO2oLxPHy0PrT2bo2Pu0/Bo5ZrLZzMeLtOyU4h7k+tUuPj7kPNyjULOviuGle83bypqq1arsGGK8I+Z36bNWoNZb8OFp1aRI4hh7ld5zK85XCjBzAta7uy3+kYpGMvysQeRrkURTnSACFC2KOKnJ1uldxoUrPJ/0+IyPvn9W6vW6egUpDsFMI4GicNdarWwbeKL0mZScSmxRKdGo2nqyeGMt7arCLk5tWbV1l7Zi1rzqyhfrX6LOixgL6N+prslqDWItlpWdKxF2ViD6NcWoo5Rqo1J0cZIEQIeyTZ+f8kO4VwXGqVmlqutahZuSbpt9PRZeiISY3h1W9eZUyrMfRv0h+ts9aoZTlqbmbnZBN2IYzVv63m9I3TjGw5krDhYSWOZSTZKe5FDpOUgaIYiI9fz6lT7TlyxJtTp9oTH78epYxHIs1hzZo1BAUF0adPH3788UeTL99eRrkUQtgGe8hNkOwUQtgWe89OlUpFFW0VGtZoiF9VPwY0GcCyk8uovbg2k3dO5pcrv6DP1d932Y6Um/pcPfsu7WPa99Pw+8iPVeGreOqhp4h9MZZl/ZbJAMWiXOQb+1KyxnU+pfX777+zY8cOtm/fTnp6OsOHD+eRRx6hWrVqJmtDRrkUQhjLHnITJDuFELbF0bJTrVIzoc0EJrSZwLWUa2yI2MCLe1/kys0r9G7Ym+DGwfRt3JdarrUKvc/eczP9djp7/9rLtgvb2P3nbprUbEJo01BOTDpB/er1rV2ecCDWTwM7Y8x1PmU1Y8YMNm/eXPD8ySef5OzZs4XmmThxIiEhIYUex48fLzTPoUOH6NWrF1qtlpo1a/LII4/wyy+/lLmu4vj7T0etdiv2NRnlUghxJ3PmJkh2CiEckyNnZ12Pusx6dBbhU8KJfDaSng168t2F72i4pCEdvujAS3tf4pvIb7iUfAk/v3/bVW7eSLvBtvPbmPnTTLqv7U7tD2vz2enP6OLfhchnIzk+6TgzH50pnXphcvKNfSmZ8zqfIUOGsHTpUoYNG0ZsbCxJSUk8+OCDheZZvXp1icvR6XS0atWq4LmnpydxcXFlquleZJRLIYSxzH19pGSnEMIRVZTsrF2lNpPaTmJS20lk52RzLOYYR6OP8s25b3j5p5e5pb9F0yqu1He5TT1XPf6Vwd8VqlSybm5m52TzZ9Kf/JHwB+cTzhOZEMmJ2BOk306nQ50OdPTryJyuc+hQpwMeLh5WqVFULNKxLyVzXufToUMHXnvtNWJiYti+fTshISFF5pk4cSKJiYmFps2ePZuOHTsWPDcYil53pVbb/z0+hRD2ydzXR0p2CiEcUUXMTq2zlu4PdKf7A90LpsWlx3Ey9gQH//yKk9cP8G1MGtGZBqpqNTTzTKbRpcnUrlKb2lVq4+vum/dvFV9qudZC66Qt08jyWTlZpGankngrkdjUWGJSY4hNy/s3JjWGi/9c5FrKNR6o9gDNPJvRvFZzBgUMYsHjC2hUo5Hdj2Yv7JN07EvJnNf5qFQqBg0axPfff8+ePXuKPUpqzJFTHx8fEhISCp4nJCRQv77pT/eRUS6FEMYw9/WRkp1CCEck2fm/5bv7MCBgIAMCBhZMMygGYlNjufjPRf5K+osb6TcIvxHOjfQb3Ei7wfW06yRlJpFjyMG9kjvuldypoq2Cm8YNtUqNQt7I8oqioKCQa8gl7XYaqdmppGanoigKHi4e1KxcE7+qftSpWoc6VerQ2rs1fRv1pXHNxjSq0YhKTpVM9jmFKC/p2JeSv/90oqKmFHtqlCmu8xk8eDCjRo2iUaNGeHt7l2kZgYGBvP766zz11FNkZmZy/Phx/vWvf5WrLiGEKCtz5yZIdgohHI9k572pVWr8Pfzx9/CnR4Me95xPn6snQ59BWnYa6bfTSb+djkExoFKpUJH3rbpKpcJJ5URVbdWCh7G34hPClkjHvpTMfX2kr68vvr6+hIaGlnkZrVu3ZuDAgTzxxBPk5OTwwgsvlDmshRCivCxxXblkpxDC0Uh2lp/GSUM1p2pUczHd3U2EsFXSsS8lc14fqSgKOp2OxMREevbsWa46J0yYwIQJE8q1DCGEMAVzX1cu2SmEcESSnUKI0pCOfRmY6/rIvXv3Mn/+fObPn0+lSnLNjhDCcZjzunLJTiGEo5LsFEIYSzr2NiQoKIigoCBrlyGEEHZFslMIIUpPslMIxyIdeyHEPSmKAZ1uI9HRH5GdHY1W64+4QIZJAAAUiElEQVS//3S8vEbKbbmEEOIeJDuFEKL0JDvLRzr25F1jVBHvN6koirVLEDZMUQxERg4uNGiPXq8jKmoKCQlbaNFiq4RsBVdRs7O4ezYLkU+yU5SkIman7HOKkkh2lp/FO/bXr19nxowZ/PPPP9SvX58PPvgANze3QvNMnTqVGzduAHk7UBcvXmTLli00bdqUDh064O/vXzDvd999h5OTU5nrcXFx4Z9//qFmzZoVKmQVReGff/7BxcXF2qVYhRwRLJlOt7HISLwABkMGSUk/odNtkvtwV2AVMTsVRUGv1xMfH1/k71ZFIdlZMslOcT8VNTsr8j4nSHYaQ7Kz/CzesX/jjTcYNWoUwcHBLF++nBUrVjBjxoxC86xcubLg/5988gkPPfQQrVq1IjIykjZt2rB69WqT1ePn50dMTAwJCQkmW6a9cHFxwc/Pz9plWJwcETROdPRHxd47F/JCNjp6sQRsBVZRs9PZ2RkPDw9q1apl7VIsTrLTOJKd4n4qanZW1H1OkOw0lmRn+Vm0Y6/X6zl58iTLly8HYPDgwYwZM6ZIxz7fpUuXCAsLY+fOnQBERESQlJTE4MGDcXZ25uWXX+aRRx4pV00ajYb69euXaxnCvljziKA9HbHNzo4u4fUYC1UibJFkZ8Vjrey0p9wEyU5xf5KdFY9kp3EkO8vPoj/V5ORk3N3dcXbOO57g6elJfHz8PedfsWIFEydOxN3dHQCVSkWPHj345ptvmD9/PtOnTycpKckitQvHYcwRQXPIP2IbFTWF9PTT6PU60tNPExU1hXPnhqAotnXdrlbrX8LrFfPIuxAVlTWy095yEyQ7hRCFSXYaR7Kz/MzWsd+zZw+BgYGFHi+99FKR64nudX1RSkoKR44cYejQoQXTRowYwXPPPYdGo6F58+a0bt2a8PBwc30E4aCsdUTQmCO2tsTffzpqdfHXEavVbvj7v2jhioQQ1mSN7LS33ATJTiFEYZKdxpHsLD+znYrft29f+vbtW2iaXq+nQ4cO5Obm4uTkREJCAl5eXsW+/+DBgwQGBqLVagumhYWF0bZtW+rWrQvkDcah0WiMqic3NxeAuLi4snwc4UBSU+uQkXHvMz3c3GoTE2P6kI2I+JCMjGyK/7XLJiPjA1q1CjR5u2WlKIHo9YGkpBzBYLhVMF2tdqVatUe5fburWdaTvcnPlPyMcSSSm+JO1shOe8tNkOw0hiPnJkh2isIkO40j2VmykrLTotfYazQa2rdvz+7duxkwYABhYWEEBha/UZ05c4b27dsXmhYVFcWZM2eYP38+ly5d4vz587Rr186otvMHKRk9enT5PoRwEA3u81oG0MPB2i0Pn2Km/QX0tHQhNi0hIYF69epZuwyTktwURVkjw+wxN0Gys2SOmJsg2SmKI9lpPMnOktwrO1WKhW8sGRsby6xZs/jnn3/w9fVl8eLFeHh4sHHjRnQ6Hf/6178AePrpp3nyyScLdfzT09OZM2cOly5dQqVSMXfuXDp27GhUu1lZWURGRuLp6Vmu2+MJIcSdcnNzSUhIoGXLlg53Kx/JTSGEOThyboJkpxDCPErKTot37IUQQgghhBBCCGE6tnevAyGEEEIIIYQQQhhNOvZCCCGEEEIIIYQdk469EEIIIYQQQghhx6RjL4QQQgghhBBC2DHp2AshhBBCCCGEEHZMOvZCCCGEEEIIIYQdk469EEIIIYQQQghhx6RjL4QQQgghhBBC2DFnaxdgTdevX2fGjBn8888/1K9fnw8++AA3N7dC80ydOpUbN24AYDAYuHjxIlu2bKFp06Z06NABf3//gnm/++47nJyczF5TbGws/fv3p27dugDUqlWL1atXoygKixYt4sCBA6jVat566y3atWtn9np0Oh2zZ88mMTERtVrNK6+8QqdOndDr9SZdRzt37uTTTz8lJyeHcePGMXr06EKvnz9/nrlz55KRkUH79u154403cHZ2NuozlFVJNe3bt4+lS5eiKAp+fn4sXLgQDw8Ptm3bxocffkjNmjUB6N69O9OnT7dITcuWLWPr1q1UrVoVgGHDhjF69Gizraf71XP+/HlmzZpV8DwpKQkPDw927dpl1nUEkJ6ezogRI1i5ciV+fn6FXrPGtmRPJDtNU49kp+1kp63lZkk1WSs7JTfLx9ay09Zy09iaKmp22lpuGlOTZGcei2WnUoFNnjxZ2bVrl6IoirJs2TJl0aJF953/448/Vl599VVFURQlIiJCmTBhglVq+uGHH5TXXnutyPQ9e/YoTz/9tJKbm6tcunRJ6dWrl6LX681ez0svvaSsW7dOURRF+fvvv5XOnTsrOTk5Jl1HcXFxymOPPaYkJycrGRkZyoABA5Q///yz0DzBwcHKb7/9piiKosyePVtZv3690Z/BHDWlpaUpXbp0UeLi4hRFydt+3nrrLUVRFOXNN99Udu7caZI6SlOToijKlClTlPDw8CLvNcd6MqaefLdu3VKCg4OVkydPKopivnWkKIpy5swZpX///kqLFi2U6OjoIq9beluyN5KdpqlHstM2stPWctPYmvJZKjslN8vP1rLT1nLT2JoqYnbaWm4aU5OiSHYqimWzs8Keiq/X6zl58iR9+vQBYPDgwfzwww/3nP/SpUuEhYUxc+ZMACIiIkhKSmLw4MEMGzaMEydOWKymiIgILl68SEhICGPHjiUqKgqAgwcP0q9fP9RqNfXr18fX15fffvvN7PX06tWL/v37A1CvXj2ys7O5deuWSdfR0aNH6dixI9WqVcPV1ZU+ffoUqiU2NpasrCweeuihQrWW9udsypr0ej3z5s3D29sbgICAgIKj8BEREWzbto0BAwbw8ssvk5KSYpGaACIjI/nss88YMGAAb775JtnZ2WZbT8bUk++zzz7j4Ycfpn379oD51hHA5s2bmTdvHl5eXkVes8a2ZE8kO01Xj2SnbWSnreWmsTXls1R2Sm6Wj61lp63lZmlqqojZaWu5aUxNINkJls3OCtuxT05Oxt3dHWfnvKsRPD09iY+Pv+f8K1asYOLEibi7uwOgUqno0aMH33zzDfPnz2f69OkkJSVZpCatVsvAgQPZtm0bEydOZNq0ady+fRudTldoo/H09CQuLs7s9fTp0wcPDw8AVq9eTbNmzahSpYpJ15FOp8PT07PguZeXV6Fa7n49v9bS/pxNWVP16tXp1asXAFlZWXz++ef07NmzoI5nn32WHTt24Ovry5tvvmmRmjIyMmjWrBkzZsxg27ZtpKamsmLFCrOtp5LqyZeWlsbmzZt57rnnCqaZax0BvPPOOwVBXlLNltiW7Ilkp+nqkewsviZLZ6et5aYxNeWzZHZKbpaPrWWnreVmaWqqiNlpa7lpTE2SnXksmZ0V4hr7PXv2sHDhwkLT6tWrh0qlKjTt7uf5UlJSOHLkCO+8807BtBEjRhT8v3nz5rRu3Zrw8PCCXyJz1vT8888X/L9bt258+OGHXLp0CYPBUGh+RVFQq407dlPedQSwdu1avvnmG9atWweUfx3dqbjPdufze71+93wlfQZT1pQvLS2NadOm0bRpU0JDQwFYvnx5weuTJk0qCGNz1+Tm5saqVasKnk+YMIE5c+YwatQos6wnY9fRjh076NmzZ8F1TWC+dVQSa2xLtkqy07z15JPstG522lpuGlNTPlvJTsnNwmwtO20tN8tbU76KlJ22lpvG1CTZWTJTb0cVomPft29f+vbtW2ha/gAbubm5ODk5kZCQUOwpEpB3ulFgYCBarbZgWlhYGG3bti0YTERRFDQajUVq+vrrr+nfvz/Vq1cvaNvZ2RkfHx90Ol3BfImJiff8TKasB2DRokUcPHiQ9evX4+PjA5R/Hd3Jx8eHU6dOFTy/uxYfHx8SEhIKnud/9ho1apCWlmbUZzB1TZB3JG7ixIl07NiROXPmAHmhu3XrVsaPHw/krZfyDhxmbE3Xr1/n6NGjPPHEEwVtOzs7m209GbOOIG/AlylTphQ8N+c6Kok1tiVbJdlp3npAsrO4msCy2WlruWlMTflsJTslNwuztey0tdwsb01Q8bLT1nLTmJokO42r15TbUYU9FV+j0dC+fXt2794N5IVBYGBgsfOeOXOmyCkUUVFRrFmzBsi7Dur8+fPlHg3U2JpOnjzJli1bADhx4gQGg4EGDRoQGBjIzp07yc3N5erVq1y5coVWrVqZvZ61a9fy66+/snHjxoJwBdOuo86dO3Ps2DGSkpLIzMzkxx9/LFRLnTp10Gq1nD59GoDt27cTGBhYqp+zqWvKzc1l6tSp9O3bl7lz5xYcaXN1deWLL77g7NmzAKxbt85kRwVLqsnFxYX333+f6OhoFEVh/fr19OrVy2zrqaR6IC88z507R5s2bQqmmXMdlcQa25I9kew0XT2SnbaRnbaWm8bUBLaVnZKbJbO17LS13CxNTRUxO20tN42pSbKzZCbfjkocXs+BxcTEKGPGjFH69u2rTJgwQbl586aiKIqyYcMG5eOPPy6Yb9KkScrBgwcLvTctLU15/vnnleDgYKV///7KsWPHLFZTXFycMn78eCU4OFgZPHiwcv78eUVRFMVgMCjvvvuu0q9fP6Vfv37Kf//7X7PXYzAYlPbt2yvdu3dXBg4cWPCIi4sz+TrasWOHEhwcrPTu3Vv5/PPPFUXJ+9n8/vvviqIoyvnz55UhQ4Yoffr0UV588UUlOzv7vp/BFO5X048//qgEBAQUWi9z5sxRFEVRTp48qQwaNEgJCgpSpk6dqqSmplqkJkXJG+E2//VZs2aZfT2VVE9iYqLSuXPnIu8z5zrK99hjjxWMUGrtbcmeSHaWvx7JTtvKTlvLTWNqslZ2Sm6Wna1lp63lpjE1VeTstLXcLKkmRZHsvJMlslOlKIpiziMRQgghhBBCCCGEMJ8Keyq+EEIIIYQQQgjhCKRjL4QQQgghhBBC2DHp2AshhBBCCCGEEHZMOvZCCCGEEEIIIYQdk469EEIIIYQQQghhx6RjLywmJiaGgIAAxowZU+S1WbNmERAQQFJSEhEREbzwwgtmrye/vbvt37+ft99+2+jlhIWFERISQkhICI888ghdu3YteH7q1KlS1ZSWlsbYsWPvO8+NGzfo2rVrsbULIRyPZGfJJDuFEHeT7CyZZKdjcbZ2AaJi0Wq1XL58mdjYWOrUqQPArVu3CA8PL5inVatWLFmyxFol0qNHD3r06GH0/IMGDWLQoEFA3h+Kxo0bM3HixDK1nZKSQkRExD1fDwsLY8mSJeh0ujItXwhhnyQ770+yUwhRHMnO+5PsdCzyjb2wKCcnJ/r27cvOnTsLpv3444+FAu3XX3+lf//+AGRkZDB79mz69OlDv379WLx4MYqiMGvWLKZOnUpwcDDvv/8+aWlpvPzyy/Tv358BAwawaNEicnJyADh79ixDhw6lf//+hIaGcuzYsYK2li5dyuDBg3n88cdZv349AN999x1TpkwB4Mknn2ThwoU88cQT9OjRo9TBHx4ezqhRowgNDWXIkCEcOHAAgISEBCZMmEBoaCihoaF8/PHHAMyePZusrCxCQkLIzc0ttKz4+Hj27dvH6tWrS1WDEML+SXZKdgohSk+yU7KzIpGOvbC4QYMGsX379oLnYWFhhIaGFjvvkiVLyM7OZvfu3YSFhREeHs6JEycAyMrK4vvvv2fGjBm8/fbbVKtWjZ07d7J161aioqJYs2YNer2eadOmMW3aNHbt2sVbb73FggULMBgMAPj7+/Pdd9+xbNky3n33XfR6fZEaLl++zMaNG9m2bRu7d+8uCMmSpKSkMHv2bBYtWsS2bdtYsWIF8+fP5/r162zevBk/Pz+2bdvG+vXruXr1KmlpaSxcuBAXFxe2b9+Ok5NToeV5e3uzbNky6tevb1T7QgjHItkp2SmEKD3JTsnOikJOxRcW17JlS5ycnIiMjKRmzZpkZGTQpEmTYuc9evQos2fPxsnJCScnJ9atWwfAtm3baNeuXcF8hw4dYuPGjahUKipVqsSIESP46quv6NKlC2q1mu7duxe0fedR2/wjtM2aNeP27dukp6cXqWH48OFoNBo0Gg1BQUEcPnyYxx57rMTPeebMGRISEpg2bVrBNJVKRVRUFF27dmXy5MncuHGDzp0789JLL1GlShVSUlJKXoFCiApJslOyUwhRepKdkp0VhXTshVUMHDiQHTt2UKNGDUJCQu45n7OzMyqVquD5jRs3cHFxAcDV1bVgusFgKDSfwWAgJycHJyenQtMBLl68SIMGDQqWDxTMoyhKsTXkUxQFtdq4E11yc3Np2LAh3377bcG0+Ph4atSogUajYf/+/Rw7dozjx48zdOhQVq1aRbVq1YxathCiYpLslOwUQpSeZKdkZ0Ugp+ILqwgJCeGHH35g9+7dBUcvi9OpUye2bduGwWDg9u3bvPDCC5w8ebLIfI8++ijr1q1DURRu377N5s2b6dy5Mw0aNEClUnHkyBEAzp07x7hx4wpOiTLGjh07MBgMpKSksGfPHh5//HGj3vfQQw9x9erVgnrPnz9Pnz59iI+P54MPPmDFihX07NmTuXPn0qhRI/7880+cnZ3Jzc0tNuiFEEKyU7JTCFF6kp2SnRWBfGMvrMLb25uGDRtSpUqV+x4tfO6553jnnXcKBvXo168fvXv35ueffy4036uvvsrbb7/NgAED0Ov1dO3alalTp1KpUiWWLl3KggULWLRoERqNhqVLl1KpUiWja83KyuKJJ54gIyODUaNG0alTJ6PeV6NGDZYsWcKiRYvIzs5GURQWLVqEn58f48aNY9asWfTv359KlSoREBBAcHAwTk5OtG7dmuDgYNavX0/16tWNrlMI4fgkOyU7hRClJ9kp2VkRqBQ5RCPEPT355JOMHj2aoKAga5cihBB2Q7JTCCFKT7JTlIecii+EEEIIIYQQQtgx+cZeCCGEEEIIIYSwY/KNvRBCCCGEEEIIYcekYy+EEEIIIYQQQtgx6dgLIYQQQgghhBB2TDr2QgghhBBCCCGEHZOOvRBCCCGEEEIIYcf+D+wQd8JzTe+bAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1224x360 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1,3, sharey = True, figsize=(17,5))\n",
    "\n",
    "# 决策边界，咱们分别来看看正则化系数lambda太大太小分别会出现什么情况\n",
    "# Lambda = 0 : 就是没有正则化，这样的话，就过拟合咯\n",
    "# Lambda = 1 : 这才是正确的打开方式\n",
    "# Lambda = 100 : 卧槽，正则化项太激进，导致基本就没拟合出决策边界\n",
    "\n",
    "for i, C in enumerate([0.0, 1.0, 100.0]):\n",
    "    # 最优化 costFunctionReg\n",
    "    res2 = minimize(costFunctionReg, initial_theta, args=(C, XX, y), jac=gradientReg, options={'maxiter':3000})\n",
    "    \n",
    "    # 准确率\n",
    "    accuracy = 100.0*sum(predict(res2.x, XX) == y.ravel())/y.size    \n",
    "\n",
    "    # 对X,y的散列绘图\n",
    "    plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0', axes.flatten()[i])\n",
    "    \n",
    "    # 画出决策边界\n",
    "    x1_min, x1_max = X[:,0].min(), X[:,0].max(),\n",
    "    x2_min, x2_max = X[:,1].min(), X[:,1].max(),\n",
    "    xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "    h = sigmoid(poly.fit_transform(np.c_[xx1.ravel(), xx2.ravel()]).dot(res2.x))\n",
    "    h = h.reshape(xx1.shape)\n",
    "    axes.flatten()[i].contour(xx1, xx2, h, [0.5], linewidths=1, colors='g');       \n",
    "    axes.flatten()[i].set_title('Train accuracy {}% with Lambda = {}'.format(np.round(accuracy, decimals=2), C))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
